Na temat naszych przyjaciół z Puzzling.SE opublikowano następującą łamigłówkę: Czy tę łamigłówkę chromatyczną zawsze można rozwiązać? autor: Edgar G. Możesz zagrać tutaj .
Wyjaśnienie puzzli
Biorąc pod uwagę m x n
siatkę z kafelkami trzech różnych kolorów, możesz wybrać dowolne dwa sąsiednie kafelki , jeśli ich kolory są różne . Te dwa kafelki są następnie konwertowane na trzeci kolor, tj. Na jeden kolor nie reprezentowany przez te dwa kafelki. Układanka jest rozwiązana, jeśli wszystkie płytki mają ten sam kolor . Najwyraźniej można udowodnić, że ta łamigłówka jest zawsze do rozwiązania, jeśli ani m
nie n
można podzielić przez 3.
Oczywiście wymaga to algorytmu rozwiązywania. Napiszę funkcję lub program, który rozwiązuje tę zagadkę. Zauważ, że funkcje z „efektami ubocznymi” (tj. Wyjście jest włączone, stdout
a nie w niektórych niezręcznych wartościach zwracanych przez dane) są wyraźnie dozwolone.
Wejście wyjście
Wejście będzie m x n
macierz składa się z liczb całkowitych 1
, 2
i 3
(lub 0
, 1
, 2
jeśli jest to wygodniejsze). Możesz wziąć to wejście w dowolnym rozsądnym formacie. Zarówno m
a n
są >1
i nie jest podzielna przez 3. Można założyć puzzli nie jest rozwiązany
Następnie rozwiążesz zagadkę. Będzie to wymagało powtórnego wyboru dwóch sąsiadujących ze sobą płytek do „konwersji” (patrz wyżej). Będziesz generować dwie współrzędne tych płytek dla każdego kroku, który wykonał algorytm rozwiązywania. Może to być również dowolny rozsądny format wyjściowy. Możesz swobodnie wybierać między indeksowaniem współrzędnych w oparciu o 0 lub w oparciu o 1, a także o tym, czy wiersze lub kolumny są najpierw indeksowane. Proszę jednak o tym wspomnieć w swojej odpowiedzi.
Twój algorytm powinien działać w rozsądnym czasie na oryginalnej obudowie 8x8. Brutalne wymuszanie go całkowicie jest wyraźnie niedozwolone, tzn. Twój algorytm powinien działać zgodnie O(k^[m*(n-1)+(m-1)*n])
z k
liczbą kroków potrzebnych do rozwiązania. Jednak rozwiązanie nie musi być optymalne. Dowód podany w połączonym pytaniu może dać ci wyobrażenie, jak to zrobić (np. Najpierw zrób wszystkie kolumny, używając tylko sąsiadujących pionowo płytek, a następnie zrób wszystkie rzędy)
Przypadki testowe
W tych przypadkach testowych współrzędne są oparte na 1, a wiersze są najpierw indeksowane (jak MATLAB / Octave i prawdopodobnie wiele innych).
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]
W razie potrzeby mogę opublikować zestawienie większych przypadków testowych, ale myślę, że powinno to wystarczyć.