У наших друзів на Puzzling.SE була розміщена така загадка: Чи завжди ця хроматична головоломка вирішується? автор Едгар Г. Ви можете зіграти тут .
Пояснення головоломки
Давши m x n
сітку з плитками трьох різних кольорів, ви можете вибрати будь-яку дві сусідні плитки , якщо їх кольори різні . Ці дві плитки потім перетворюються в третій колір, тобто в один колір, який не представлений цими двома плитками. Головоломка вирішується, якщо всі плитки мають однаковий колір . Мабуть, можна довести, що ця головоломка завжди вирішується, якщо ні те, m
ні n
діляться на 3.
Звичайно, це вимагає алгоритму вирішення. Ви напишете функцію або програму, яка вирішує цю загадку. Зауважте, що функції з "побічними ефектами" (тобто вихідний показник увімкнено, stdout
а не в якомусь незручному поверненому типі даних) явно дозволені.
Введення-виведення
Вхід буде m x n
матриця , що складається з цілих чисел 1
, 2
і 3
(або 0
, 1
, 2
якщо це зручно). Ви можете взяти цей ввід у будь-якому розумному форматі. І те, m
і n
є, >1
і не ділиться на 3. Ви можете припустити, що головоломка не вирішена
Потім ви вирішите головоломку. Це вимагатиме повторного вибору двох сусідніх плиток для "конвертування" (див. Вище). Ви виведете дві координати цих плиток для кожного кроку, зробленого вашим алгоритмом вирішення. Це також може бути у будь-якому розумному форматі виводу. Ви можете вибирати між індексацією ваших координат на основі 0 та 1 та першими індексувати рядки чи стовпці. Будь ласка, згадайте це у своїй відповіді.
Ваш алгоритм повинен працювати протягом розумного часу в оригінальному випадку 8х8. Насильницьку грубу цілість явно заборонено, тобто ваш алгоритм повинен виконуватись 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]
За бажанням я можу розмістити пастин з більших тестових випадків, але я думаю, що цього має бути достатньо.