Drüben bei unseren Freunden bei Puzzling.SE wurde das folgende Rätsel gestellt: Ist dieses chromatische Rätsel immer lösbar? von Edgar G. Sie können es spielen hier .
Puzzle Erklärung
Bei einem m x n
Raster mit Kacheln mit drei verschiedenen Farben können Sie zwei benachbarte Kacheln auswählen , wenn ihre Farben unterschiedlich sind . Diese beiden Kacheln werden dann in die dritte Farbe konvertiert, dh die eine Farbe, die von diesen beiden Kacheln nicht dargestellt wird. Das Rätsel ist gelöst, wenn alle Kacheln die gleiche Farbe haben . Anscheinend kann man beweisen, dass dieses Rätsel immer lösbar ist, wenn es weder durch 3 teilbar m
noch n
teilbar ist.
Dies erfordert natürlich einen Lösungsalgorithmus. Sie werden eine Funktion oder ein Programm schreiben, das dieses Rätsel löst. Beachten Sie, dass Funktionen mit 'Nebenwirkungen' (dh die Ausgabe ist aktiviert stdout
und nicht in einem unangenehmen Datentyp-Rückgabewert) ausdrücklich zulässig sind.
Input-Output
Die Eingabe wird eine sein , m x n
Matrix , bestehend aus den ganzen Zahlen 1
, 2
und 3
(oder 0
, 1
, 2
wenn praktisch). Sie können diese Eingabe in jedem vernünftigen Format vornehmen. Beide m
und n
sind >1
und nicht durch 3 teilbar. Sie können davon ausgehen, dass das Rätsel nicht gelöst ist
Sie lösen dann das Rätsel. Dies beinhaltet eine wiederholte Auswahl zweier benachbarter Kacheln, die „konvertiert“ werden sollen (siehe oben). Sie geben die beiden Koordinaten dieser Kacheln für jeden Schritt aus, den Ihr Lösungsalgorithmus ausgeführt hat. Dies kann auch in jedem vernünftigen Ausgabeformat erfolgen. Sie können zwischen einer 0-basierten und einer 1-basierten Indexierung Ihrer Koordinaten wählen und festlegen, ob Zeilen oder Spalten zuerst indexiert werden sollen. Bitte erwähnen Sie dies jedoch in Ihrer Antwort.
Ihr Algorithmus sollte innerhalb einer angemessenen Zeit auf dem ursprünglichen 8x8-Gehäuse ausgeführt werden. Brute-Forcing ist ausdrücklich untersagt, dh Ihr Algorithmus sollte O(k^[m*(n-1)+(m-1)*n])
mit k
der für die Lösung erforderlichen Anzahl von Schritten ausgeführt werden. Die Lösung muss jedoch nicht optimal sein. Der in der verknüpften Frage angegebene Beweis kann Ihnen eine Vorstellung davon geben, wie dies zu tun ist (z. B. zuerst alle Spalten unter Verwendung nur vertikal benachbarter Kacheln und dann alle Zeilen).
Testfälle
In diesen Testfällen sind die Koordinaten 1-basiert und die Zeilen werden zuerst indiziert (wie MATLAB / Octave und wahrscheinlich viele andere).
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]
Auf Wunsch kann ich einen Pastebin größerer Testfälle posten, aber ich denke, das sollte ausreichen.