Напишите программу или функцию, которая принимает три целых числа: ширину w
, высоту h
и количество шагов s
. Вы будете рисовать не-самопересекающиеся случайные блуждание s
шагов долго на 5*w
по 5*h
пиксельным изображениям , где каждая 5 на 5 пиксели клетки является либо пустым (чистой бежевой) или один из этих двенадцати простых «трубы»:
Изображение выше увеличено, чтобы показать детали. Вот трубы в реальном размере:
(Серые линии просто для разделения типов труб.)
Случайный обход будет представлять собой один непрерывный путь по трубе, который начинается в одной конечной точке трубы (один из четырех нижних типов труб) и заканчивается в другой конечной точке трубы.
Начните с пустой w
по h
сетке и случайным образом выберите одну ячейку в качестве отправной точки. Затем случайным образом выберите одно из четырех направлений для начала и нарисуйте соответствующую конечную точку трубы. Эта начальная ячейка отмечает первый шаг в вашей прогулке, и каждый раз, когда вы рисуете новую ячейку или перезаписываете существующую, она считается еще одним предпринятым шагом.
Теперь, многократно, произвольно выбирайте движение вправо, влево или по прямой, рисуя соответствующую ячейку трубы, если выбранное направление действительно. Вернитесь назад и повторно выберите, если направление недействительно, пока не будет сформирован полный s
путь шага. Путь должен заканчиваться конечной точкой трубы, которая может находиться в любом месте сетки, в зависимости от пути, по которому проходил путь.
Очень важно отметить, что только две ячейки прямой трубы могут быть перезаписаны, и только ячейкой прямой трубы противоположной ориентации, в результате получается ячейка пересечения. В противном случае все трубы должны быть размещены в пустых ячейках.
Когда нарисовано пересечение, часть пути, которая находится дальше от начальной ячейки, должна быть нарисована сверху.
Это зависит от вас, имеет ли сетка периодические граничные условия (PBC), т. Е. Выйдет ли труба, выходящая из одной стороны сетки, с другой стороны. Без PBC граница сетки считается барьером, с которым вы можете столкнуться, как и другие трубы.
Особые случаи
- Когда
s
равен 0, трубы не должны быть нарисованы, и результат должен быть пустым5*w
по5*h
изображению (т.е. все бежевое). Когда
s
1 1 заглушкадолжен быть нарисован в случайно выбранной начальной ячейке.
Другие детали
- Вы можете предположить, что
s
это самое большее,w*h
поэтому путь всегда будет возможен. (Хотя более длинные пути возможны из-за пересечений.) w
иh
всегда будет позитивным.- Все случайные выборы должны быть равномерно случайными. Например, вы не должны избегать пересечений, когда это возможно, даже если это облегчает проблему. Допускаются генераторы псевдослучайных чисел.
- Любые три визуально отличных цвета могут использоваться вместо черного, синего и бежевого.
- Ваши выходные изображения могут быть увеличены таким образом , что они на самом деле
5*w*k
от5*h*k
точек , гдеk
является положительным целым числом. (Рекомендуется увеличивать любые примеры, которые вы публикуете, даже если вашk
1.) - Можно использовать любой общий формат файла изображения без потерь, и изображение может быть сохранено в файл, отображено или выброшено в исходном виде на стандартный вывод.
Самый короткий код в байтах побеждает.
Примеры
(Все увеличено на 500%.)
Если вход - w=2, h=1, s=0
то выход всегда будет:
Если на входе w=2, h=1, s=1
выводится одно из этих изображений с равной вероятностью:
Если на входе, w=2, h=1, s=2
то выход будет
или возможно
если предполагается, что сетка имеет PBC.
(Обратите внимание, что запуск пути как будто сделает второй шаг невозможным.)
Вот некоторые возможные результаты для w=3, h=2, s=6
предположения PBC:
Вот возможный вывод для w=3, h=3, s=9
предположения PBC:
Обратите внимание, что путь не должен покрывать все ячейки из-за пересечения, считающегося как два шага. Кроме того, мы можем сделать вывод, что угловая конечная точка была начальной ячейкой, поскольку путепровод пересечения должен был быть нарисован впоследствии. Таким образом, мы можем вывести последовательность случайных выборов, которые были сделаны:
start at top left, facing east
go straight
go right
go right
go right
go straight
go left
go right
end
Наконец, вот примеры w=4, h=5, s=20
и w=4, h=5, s=16
:
источник
You will be drawing a non-self-intersecting random walk
... это самопересекающийся или нет?Ответы:
CJam, 274
Попробуйте онлайн
Использует PBC, выводит в формате PGM. Вы можете удалить
:+
ближе к концу, чтобы получить более хороший визуальный вывод в браузере.Это очень медленно для большего ввода, особенно если количество шагов близко к области.
Пример результата для ввода
4 3 10
(масштабируется на 500%):Краткое объяснение:
Общий подход:
источник
QBasic,
517516 байтw
,h
иs
из пользовательского ввода, через запятую.Подход здесь заключается в том, чтобы на каждом шаге попробовать случайное направление и начать все сначала, если это приведет к неверному движению. Мы рисуем трубы по мере определения направлений и используем их
POINT
для проверки точек на экране в соответствии с нашими условиями действия. Ход действителен, если он не выходит за пределы сетки и:Как и в ответе CJam от aditsu , этот код очень медленный и может быть ошеломляющим, если он
s
составляет значительную частьw*h
. На моей настройке QB64 он дает ответ5,5,19
довольно быстро, но занимает больше времени, чем я готов был ждать5,5,20
.Если вы хотите запускать большие / более плотно упакованные примеры, вот мой оригинальный подход с использованием поиска в глубину . Это гораздо более эффективно, за счет колоссальных 300 дополнительных байтов.
Пример вывода для входных данных
10, 10, 100
, фактический размер:Еще более причудливая версия может быть найдена в этой сути . Помимо того, что его не разгуливают и тщательно комментируют, он увеличивает постоянный коэффициент на выходе и допускает заданную задержку между шагами, позволяя вам наблюдать за алгоритмом DFS в работе. Вот пример запуска:
источник