Nei nostri amici di Puzzling.SE è stato pubblicato il seguente puzzle: Questo puzzle cromatico è sempre risolvibile? di Edgar G. Puoi giocarci qui .
Spiegazione del puzzle
Data una m x n
griglia con tessere di tre colori diversi, è possibile selezionare due tessere adiacenti , se i loro colori sono diversi . Queste due tessere vengono quindi convertite nel terzo colore, ovvero l'unico colore non rappresentato da queste due tessere. Il puzzle è risolto se tutte le tessere hanno lo stesso colore . A quanto pare, si può dimostrare che questo puzzle è sempre risolvibile, se non m
ne n
sono divisibile per 3.
Naturalmente, ciò richiede un algoritmo di risoluzione. Scriverai una funzione o un programma che risolve questo enigma. Si noti che le funzioni con "effetti collaterali" (ovvero, l'output è attivo stdout
anziché in un valore di ritorno del tipo di dati scomodo) sono esplicitamente consentite.
Input Output
L'ingresso sarà una m x n
matrice costituita da numeri interi 1
, 2
e 3
(o 0
, 1
, 2
se conveniente). Puoi prendere questo input in qualsiasi formato sano. Sia m
e n
sono >1
e non divisibile per 3. Si può assumere il puzzle non è risolto
Quindi risolverai il puzzle. Ciò comporterà una ripetuta selezione di due tessere adiacenti da "convertire" (vedi sopra). Verranno emesse le due coordinate di queste tessere per ogni passaggio effettuato dall'algoritmo di risoluzione. Questo può anche essere in qualsiasi formato di output sano. Sei libero di scegliere tra l'indicizzazione in base 0 e in base 1 delle tue coordinate e se le righe o le colonne devono essere indicizzate per prime. Per favore, menzionalo nella tua risposta, comunque.
Il tuo algoritmo dovrebbe essere eseguito in tempi ragionevoli sul case originale 8x8. La forzatura bruta completamente è esplicitamente vietata, ovvero l'algoritmo dovrebbe essere eseguito O(k^[m*(n-1)+(m-1)*n])
con k
il numero di passaggi necessari per la soluzione. Tuttavia, non è necessario che la soluzione sia ottimale. La prova fornita nella domanda collegata può darti un'idea di come farlo (ad esempio, prima fai tutte le colonne usando solo tessere adiacenti verticalmente, quindi fai tutte le righe)
Casi test
In questi casi di test, le coordinate sono basate su 1 e le righe vengono prima indicizzate (come MATLAB / Octave e probabilmente molte altre).
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]
Se lo si desidera, potrei pubblicare una pastebin di casi di test più grandi, ma penso che questo dovrebbe essere sufficiente.