обзор
Жемчуг (или Масю) - логическая игра, в которую играют на сетке. На сетке размещены черный и белый жемчуг. Цель состоит в том, чтобы сформировать один замкнутый цикл которая проходит через каждую жемчужину, используя только прямые отрезки и прямые углы.
Есть несколько правил, которые управляют тем, как цикл взаимодействует с жемчугом:
- Белый жемчуг должен проходить прямо через него, но петля должна повернуть в предыдущую и / или следующую ячейку на своем пути.
- Черный жемчуг должен быть включен , но петля должна пройти прямо через следующий и предыдущую клетки на своем пути.
- Цикл не должен пересекаться или иным образом пересекаться. Все ячейки имеют ровно ноль или две петли входа / выхода.
Пример головоломки из Википедии (и ее решение):
Ваша задача - решить заданную головоломку. Если есть несколько возможных решений, не имеет значения, какое вы даете.
вход
Ввод будет нерешенной квадратной сеткой. Пример, показанный выше, будет выглядеть так:
..w.w.....
....w...b.
..b.b.w...
...w..w...
b....w...w
..w....w..
..b...w...
w...b....w
......ww..
..b......b
w
белая жемчужина, b
черная жемчужина и .
пустая клетка.
Предположим, что ввод действителен. Это означает, что он хорошо сформирован, и по крайней мере одно решение возможно. Все действительные головоломки имеют размер не менее 3х3 и содержат как минимум одну жемчужину.
Выход
Выход - это строка координат, представляющая путь. Верхний левый угол сетки 0 0
, верхний правый n-1 0
, где n - ширина сетки.
Путь - это просто последовательность упорядоченных координат:
x1 y1 x2 y2 x3 y3 ...
Предполагается, что путь закрыт, поэтому вам не нужно повторять первую координату в конце, но за это не налагается штраф.
Вывод должен состоять как минимум из всех углов пути. Вам не нужно выводить каждую ячейку на пути, если нет поворота. Например, вывод для примера может начинаться с:
1 0 5 0 5 1 ...
или
1 0 2 0 3 0 4 0 5 0 5 1 ...
Вывод не должен содержать ни одной ячейки, не находящейся в пути. Вы можете начать с любой клетки на пути.
отрывок
Вот фрагмент, который вы можете использовать для визуализации вашего решения. Просто вставьте в сетку, над которой вы работаете, и путь, который вы выводите. Я знаю, что больно смотреть на мой код, поэтому я просто предлагаю вам не делать этого;)
Тестовые случаи
Эти тестовые примеры показывают один возможный выход для каждого входа (кроме последнего, который показан нерешенным). Могут быть другие допустимые пути, вы можете пойти CW или CCW или начать с другой точки и т. Д. Решения должны быть в состоянии решать тестовые случаи в секундах / минутах / часах, а не днях / неделях / эонах.
...
w..
..b
0 0 1 0 2 0 2 1 2 2 1 2 0 2 0 1
.wb..b
......
..b...
w.ww..
......
b....b
0 0 2 0 2 2 4 2 4 1 3 1 3 0 5 0 5 5 3 5 3 4 4 4 4 3 1 3 1 4 2 4 2 5 0 5 0 2 1 2 1 1 0 1
.....w.b.w..
ww..b...b...
.w.....b....
...wbww..b.b
....b.......
w.w.........
..w......b.b
.....bb.....
.....b.....w
w.ww..b.....
...w......w.
b..w.....b..
источник
Ответы:
С 590
640 760 880 963 1018Грубая сила довольно быстро для этого. Тест 12x12 выполняется менее 10 мс. Зная, что может выбрать какой-то язык, более подходящий для игры в гольф.
Я не предполагаю, что доска квадратная, поскольку большие пазлы, как правило, не квадратные.
Определение
W
устанавливает ограничение на размеры платы. Фактический предел меньше, такW - 2
как я использую дополнительные строки для границ, чтобы избежать проверки границ.Проверь меня .
Вот более сложный тестовый пример:
Мне повезло, мой код находит решение довольно рано (<5 минут), но полный поиск занимает гораздо больше времени (67 минут).
источник
Питон - 1669
Все еще довольно долго, но достаточно быстро, чтобы запустить последний пример менее чем за секунду на моем компьютере. Вероятно, можно сократить время за счет скорости, но на данный момент это в значительной степени эквивалентно незакрашенному коду.
Пример вывода для последнего контрольного примера:
Код:
Ungolfed:
источник
Lua,
830810765752739729710Работает board1 и board2 просто отлично, но занимает некоторое время на board3.
Он может сэкономить 9 байтов, выводя каждый путь вместо первого ...
источник