У наших друзей в 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]
При желании я могу опубликовать пастбин более крупных тестовых случаев, но я думаю, что этого должно быть достаточно.


