обзор
Жемчуг (или Масю) - логическая игра, в которую играют на сетке. На сетке размещены черный и белый жемчуг. Цель состоит в том, чтобы сформировать один замкнутый цикл которая проходит через каждую жемчужину, используя только прямые отрезки и прямые углы.
Есть несколько правил, которые управляют тем, как цикл взаимодействует с жемчугом:
- Белый жемчуг должен проходить прямо через него, но петля должна повернуть в предыдущую и / или следующую ячейку на своем пути.
- Черный жемчуг должен быть включен , но петля должна пройти прямо через следующий и предыдущую клетки на своем пути.
- Цикл не должен пересекаться или иным образом пересекаться. Все ячейки имеют ровно ноль или две петли входа / выхода.
Пример головоломки из Википедии (и ее решение):
Ваша задача - решить заданную головоломку. Если есть несколько возможных решений, не имеет значения, какое вы даете.
вход
Ввод будет нерешенной квадратной сеткой. Пример, показанный выше, будет выглядеть так:
..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..