En nuestros amigos de Puzzling.SE , se publicó el siguiente rompecabezas: ¿Este rompecabezas cromático siempre tiene solución? por Edgar G. Puedes jugarlo aquí .
Explicación del rompecabezas
Dada una m x n
cuadrícula con mosaicos de tres colores diferentes, puede seleccionar dos mosaicos adyacentes , si sus colores son diferentes . Estas dos fichas se convierten al tercer color, es decir, el único color no representado por estas dos fichas. El rompecabezas se resuelve si todas las fichas tienen el mismo color . Al parecer, se puede demostrar que este rompecabezas es siempre solucionable, si ninguno m
, ni n
son divisible por 3.
Por supuesto, esto exige un algoritmo de resolución. Escribirás una función o programa que resuelva este rompecabezas. Tenga en cuenta que las funciones con 'efectos secundarios' (es decir, la salida está activada en stdout
lugar de en algún valor de retorno de tipo de datos incómodo) están explícitamente permitidas.
De entrada y salida
La entrada será una m x n
matriz que consiste de los números enteros 1
, 2
y 3
(o 0
, 1
, 2
si es conveniente). Puede tomar esta entrada en cualquier formato cuerdo. Ambos m
y n
son >1
y no son divisibles por 3. Puede suponer que el rompecabezas no está resuelto
Entonces resolverás el rompecabezas. Esto implicará una selección repetida de dos mosaicos adyacentes para ser 'convertidos' (ver arriba). Producirá las dos coordenadas de estos mosaicos para cada paso que tomó su algoritmo de resolución. Esto también puede estar en cualquier formato de salida sano. Puede elegir entre la indexación de sus coordenadas basada en 0 y en 1, y si las filas o columnas se indexan primero. Sin embargo, mencione esto en su respuesta.
Su algoritmo debe ejecutarse dentro de un tiempo razonable en el caso original de 8x8. Forzarlo por completo está explícitamente prohibido, es decir, su algoritmo debe ejecutarse O(k^[m*(n-1)+(m-1)*n])
con k
la cantidad de pasos necesarios para la solución. Sin embargo, no se requiere que la solución sea óptima. La prueba dada en la pregunta vinculada puede darle una idea de cómo hacer esto (por ejemplo, primero haga todas las columnas usando solo mosaicos adyacentes verticalmente y luego haga todas las filas)
Casos de prueba
En estos casos de prueba, las coordenadas se basan en 1 y las filas se indexan primero (como MATLAB / Octave y probablemente muchas otras).
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 lo desea, puedo publicar una pastebin de casos de prueba más grandes, pero creo que esto debería ser suficiente.