Chez nos amis de Puzzling.SE , le puzzle suivant a été posté: Ce puzzle chromatique est-il toujours résoluble? par Edgar G. Vous pouvez y jouer ici .
Explication de puzzle
m x n
Avec une grille avec des carreaux de trois couleurs différentes, vous pouvez sélectionner deux carreaux adjacents , si leurs couleurs sont différentes . Ces deux carreaux sont ensuite convertis en la troisième couleur, à savoir la couleur non représentée par ces deux carreaux. Le casse-tête est résolu si toutes les tuiles ont la même couleur . Apparemment, on peut prouver que ce puzzle est toujours soluble, si m
ni n
est divisible par 3.
Bien sûr, cela demande un algorithme de résolution. Vous allez écrire une fonction ou un programme qui résout ce casse-tête. Notez que les fonctions avec des «effets secondaires» (c'est-à-dire que la sortie est activée stdout
plutôt que dans une valeur de retour de type de données peu pratique) sont explicitement autorisées.
Entrée sortie
L'entrée sera une m x n
matrice consistant en les nombres entiers 1
, 2
et 3
(ou 0
, 1
, 2
si cela convient). Vous pouvez prendre cette entrée dans n'importe quel format sain. Les deux m
et ne n
sont >1
pas divisibles par 3. Vous pouvez supposer que le casse-tête n’a pas été résolu
Vous allez ensuite résoudre le puzzle. Cela impliquera une sélection répétée de deux tuiles adjacentes à «convertir» (voir ci-dessus). Vous allez générer les deux coordonnées de ces tuiles pour chaque étape prise par votre algorithme de résolution. Cela peut aussi être dans n'importe quel format de sortie sain. Vous êtes libre de choisir entre l'indexation de vos coordonnées basée sur 0 et celle basée sur 1, et d'indiquer si les lignes ou les colonnes sont indexées en premier. Veuillez toutefois mentionner cela dans votre réponse.
Votre algorithme doit s'exécuter dans un délai raisonnable sur le boîtier 8x8 d'origine. Le brusquement forcé est explicitement interdit, c'est-à-dire que votre algorithme doit s'exécuter O(k^[m*(n-1)+(m-1)*n])
avec k
le nombre d'étapes nécessaire à la solution. La solution n’est cependant pas obligée d’être optimale. La preuve donnée dans la question liée peut vous donner une idée de la procédure à suivre (par exemple, commencez par faire toutes les colonnes en n'utilisant que des tuiles adjacentes verticalement, puis toutes les lignes).
Cas de test
Dans ces cas de test, les coordonnées sont basées sur 1 et les lignes sont indexées en premier (comme MATLAB / Octave et probablement beaucoup d'autres).
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]
Si vous le souhaitez, je peux poster une pâte contenant des cas de test plus volumineux, mais je pense que cela devrait suffire.