У наших друзей в Puzzling.SE была опубликована следующая загадка: всегда ли эта хроматическая головоломка разрешима? Эдгар Г. Вы можете сыграть здесь .
Объяснение головоломки
Учитывая m x n
сетку с плитками трех разных цветов, вы можете выбрать любые две соседние плитки , если их цвета разные . Эти две плитки затем преобразуются в третий цвет, то есть в один цвет, не представленный этими двумя плитками. Загадка решается, если все плитки имеют одинаковый цвет . По-видимому, можно доказать, что эта головоломка всегда разрешима, если ни одна из них m
не n
делится на 3.
Конечно, это требует алгоритма решения. Вы напишите функцию или программу, которая решает эту головоломку. Обратите внимание, что функции с «побочными эффектами» (т. Е. Вывод включен, stdout
а не в каком-то неудобном возвращаемом значении типа данных) явно разрешены.
Ввод, вывод
Вход будет m x n
матрица , состоящая из целых чисел 1
, 2
и 3
(или 0
, 1
, 2
если это удобно). Вы можете принять этот вход в любом нормальном формате. Как m
и n
являются >1
и не делится на 3. Можно считать загадку не решена
Затем вы решите головоломку. Это будет включать в себя повторный выбор двух смежных плиток для «преобразования» (см. Выше). Вы будете выводить две координаты этих тайлов для каждого шага, который предпринял ваш алгоритм решения. Это также может быть в любом нормальном формате вывода. Вы можете выбирать между индексированием ваших координат на основе 0 и 1, а также в первую очередь индексировать строки или столбцы. Пожалуйста, укажите это в своем ответе, однако.
Ваш алгоритм должен работать в течение разумного времени в исходном случае 8x8. Грубое форсирование полностью запрещено, т. Е. Ваш алгоритм должен выполняться O(k^[m*(n-1)+(m-1)*n])
с k
количеством шагов, необходимых для решения. Однако решение не обязательно должно быть оптимальным. Доказательство, приведенное в связанном вопросе, может дать вам представление о том, как это сделать (например, сначала сделать все столбцы, используя только вертикально смежные плитки, а затем сделать все строки)
Контрольные примеры
В этих тестовых случаях координаты основаны на 1, и строки индексируются первыми (например, MATLAB / Octave и, возможно, многие другие).
Input:
[1 2]
Output: (result: all 3's)
[1 1],[1,2]
Input:
[ 1 2
3 1 ]
Output: (result: all 1's)
[1 1],[2 1] (turn left column into 2's)
[2 1],[2 2] (turn right column into 3's)
[1 1],[1 2] (turn top row into 1's)
[2 1],[2 2] (turn bottom row into 1's)
Input:
[1 2 3 2
3 2 1 1]
Output: (result: all 3's)
[1 1],[1 2]
[1 3],[1 4]
[1 2],[1 3]
[1 1],[1 2]
[1 2],[1 3]
[1 1],[1 2]
[1 3],[1 4]
[2 1],[2 2]
[1 1],[2 1]
[1 2],[2 2]
[1 3],[2 3]
[1 4],[2 4]
При желании я могу опубликовать пастбин более крупных тестовых случаев, но я думаю, что этого должно быть достаточно.