Em nossos amigos do Puzzling.SE , foi publicado o seguinte quebra-cabeça: Esse quebra-cabeça cromático é sempre solucionável? by Edgar G. Você pode reproduzi-lo aqui .
Explicação do quebra-cabeça
Dada uma m x n
grade com peças de três cores diferentes, você pode selecionar duas peças adjacentes , se as cores forem diferentes . Esses dois ladrilhos são convertidos para a terceira cor, ou seja, a única cor não representada por esses dois ladrilhos. O quebra-cabeça é resolvido se todas as peças tiverem a mesma cor . Aparentemente, pode-se provar que este quebra-cabeça é sempre solucionáveis, se nem m
nem n
são divisíveis por 3.
Obviamente, isso implora por um algoritmo de solução. Você escreverá uma função ou programa que resolve esse quebra-cabeça. Observe que funções com 'efeitos colaterais' (ou seja, a saída está ativada stdout
e não em algum valor de retorno de tipo de dados estranho) são explicitamente permitidas.
Entrada e Saída
A entrada será uma m x n
matriz consistindo dos inteiros 1
, 2
e 3
(ou 0
, 1
, 2
se conveniente). Você pode receber esta entrada em qualquer formato são. Ambos m
e n
são >1
e não são divisíveis por 3. Você pode assumir que o quebra-cabeça não foi resolvido
Você então resolverá o quebra-cabeça. Isso envolverá uma seleção repetida de dois blocos adjacentes a serem 'convertidos' (veja acima). Você produzirá as duas coordenadas desses blocos para cada etapa executada pelo algoritmo de resolução. Isso também pode estar em qualquer formato de saída sã. Você pode escolher entre a indexação com base em 0 e com base em 1 de suas coordenadas e se as linhas ou colunas são indexadas primeiro. Por favor, mencione isso em sua resposta.
Seu algoritmo deve ser executado dentro de um prazo razoável no gabinete 8x8 original. Forçar brutalmente completamente é explicitamente proibido, ou seja, seu algoritmo deve ser executado O(k^[m*(n-1)+(m-1)*n])
com k
o número de etapas necessárias para a solução. A solução, no entanto, não precisa ser ideal. A prova fornecida na pergunta vinculada pode fornecer uma idéia de como fazer isso (por exemplo, primeiro faça todas as colunas usando apenas blocos adjacentes verticalmente e, em seguida, todas as linhas)
Casos de teste
Nesses casos de teste, as coordenadas são baseadas em 1 e as linhas são indexadas primeiro (como MATLAB / Octave e provavelmente muitas outras).
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 desejar, posso postar uma pasta de casos de teste maiores, mas acho que isso deve ser suficiente.