Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Как нарисовать кривую Серпинского (см. ниже), не используя графические библиотеки, а '*' или слешы?

65142b48e19f9318240652.png

Порядок кривой при этом должен вводиться во время работы программы. Изображения кривых Серпинского первого, второго и третьего порядка наведены на рисунке. Программу нужно сделать через рекурсию, не используя графических библиотек, а символ '*' или, ещё лучше, разные слеши по типу /|\_-(верхний горизонтальный слеш?). Нельзя также использовать контейнеры.

Я, типа, прикинул, как это можно сделать. Можно создать динамический массив двумерный, который будет выступать полем, где каждый элемент имеет координаты, и уже типа пытаться работать с массивом и координатами. Может, ещё, типа сделать, чтобы отдельные части одного такого "квадрата" рисовали разные функции, при этом во все них передовалась координата, с которой надо начинать рисовать. Например: printVerticalLine(Point* point, ...). Но вообще не представляю, как это можно всё воедино сложить и сделать.

Буду очень благодарен, если поможете!=')
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Напрягает требование, что нельзя использовать контейнеры. Так-то ваш подход правильный: Заводим поле для вывода, рекурсивной функцией, которой передаются порядок кривой, и где ее рисовать (квадрат и его поворот). Функция рекурсивно вызывает 4 кусокчка в каждом из 4 квадратов и рисует 3 соединительных кусочка. Но поле для вывода это так или иначе массив. Можно и самому его завести, но почему нульзя использовать контейнеры - не понятно.

Второй вариант: релизовать функцию, которая (опять рекурсивно) считает какой символ вот на этой позиции в кривой вот такого порядка. Функция проверяет, лежит ли искомый символ между четырьмя квадратами. Если да, то сразу понятно - стоит там пустота или один из трех соединительных кусочков. В противном случае, рекурсивно вызываемся для нужного квадрата, пересчитав координаты, и может быть поворачиваем ответ на нужный угол.

А потом циклом выводим результат работы функции для всех координат. Это работает в логарифм раз медленее, но зато не требует выделения памяти под все поле вывода.

edit: Да, еще есть трюк - считайте, что кривая не замкнута. Левый верхний угол - пустота. И надо отдельно в самом конце замкнуть ее в этом углу через "/".
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Самый простой путь - рисовать эту картинку внутри матрицы (растр).
А потом перевести элементы этой матрицы в псевдографику https://en.wikipedia.org/wiki/Box-drawing_character

Но я тебе это не советую, потому что выглядит как сильно грубое разрешение.

Рисование слешами или зведочками возможно. Но это ASCII art. Иногда выглядит красиво
а иногда вообще нечитабельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы