O 15 Puzzle é um quebra-cabeça famoso que envolve deslizar 15 peças em uma grade 4x4. A partir de uma configuração aleatória, o objetivo é organizar os blocos na ordem correta. Aqui está um exemplo de um quebra-cabeça 15 resolvido:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
Cada movimento no quebra-cabeça tem a forma Cima / Baixo / Esquerda / Direita. O movimento "Para baixo" consiste em deslizar o ladrilho que está acima do ponto vazio para baixo. O movimento "Direito" consiste em deslizar um ladrilho para a direita, no local vazio. Aqui está como o quadro cuida dos movimentos Para baixo e para a direita.
01 02 03 04
05 06 07 08
09 10 11
13 14 15 12
O objetivo deste desafio é escrever um programa que possa gerar a série de movimentos necessários para resolver o 15 Puzzle. O vencedor é o programa que resolve os cinco casos de teste (abaixo) no menor número de movimentos. A solução gerada não precisa ser uma solução perfeita, apenas precisa ser melhor que a dos concorrentes. Para cada caso de teste individual, o programa não deve demorar mais de dez segundos em uma máquina razoável.
Seu programa deve ser capaz de resolver qualquer quebra-cabeça que possa ser solucionado. Estou apenas usando esses cinco casos de teste como pontuação.
Seu programa receberá o 15 Puzzle não resolvido como entrada no formato de uma matriz 2D. A matriz 2D pode ser formatada de acordo com o idioma usado ou alterada se o idioma não tiver matrizes 2D. O primeiro elemento do primeiro subconjunto será o número no canto superior esquerdo e o último elemento do primeiro subconjunto será o número no canto superior direito. A 0
será o espaço vazio.
Como saída, seu programa deve imprimir uma lista de movimentos na ordem em que eles precisam ser executados. Cada etapa deve ser numerada para aumentar a usabilidade dos resultados.
EDIT: Com base nos comentários, permitirei que a saída seja na forma de Down / Up / etc ou na forma das coordenadas da peça a serem movidas. Como este não é um código de golfe, a parte mais importante é resolver o quebra-cabeça.
Algumas outras regras gerais não envolvem o uso de uma fonte externa, etc.
Caso de teste 1
([5,1,7,3],[9,2,11,4],[13,6,15,8],[0,10,14,12])
Saída de exemplo:
1: Down
2: Down
3: Down
4: Left
....
Caso de teste 2
([2,5,13,12],[1,0,3,15],[9,7,14,6],[10,11,8,4])
Caso de teste 3
([5,2,4,8],[10,0,3,14],[13,6,11,12],[1,15,9,7])
Caso de teste 4
([11,4,12,2],[5,10,3,15],[14,1,6,7],[0,9,8,13])
Caso de teste 5
([5,8,7,11],[1,6,12,2],[9,0,13,10],[14,3,4,15])
fonte
Respostas:
PyPy, 195 movimentos, ~ 12 segundos de computação
Calcula soluções ideais usando o IDA * com uma heurística de "curta distância" aumentada por conflitos lineares. Aqui estão as soluções ideais:
E o código:
fonte
Etapas totais de JavaScript (ES6) 329 para todos os 5 casos de teste em ~ 1min
Editar Mesma estratégia, diferentes alvos, melhor solução. Mais devagar ...
É mais ou menos assim que eu resolvo isso manualmente: usando alvos intermediários Depois de cada alvo, os blocos relativos não são movidos novamente. Cada alvo intermediário é alcançado usando uma função BSF paramétrica. Os 2 parâmetros são a condição do loop L (repita enquanto verdadeiro) e a condição de seleção S (selecione o bloco que pode ser movido). Os passos:
Nota lateral : Não checo a posição dos ladrilhos 14 e 15. Quebra-cabeças insolúveis, como
[11,4,12,2,,15,10,3,5,,14,1,6,7,,0,9,8,13]
o 14 e o 15, foram trocados.Snippet aberto para testar ou reproduzir (apenas Firefox)
Mostrar snippet de código
Conjunto de testes No console Firefox / FireBug
Saída
fonte
Comecei a trabalhar nesse problema e queria contribuir com meu código até o momento. Como afirma Gareth, o problema é comparável ao quebra-cabeça de 8 blocos e, portanto, o código é baseado na solução magnífica de Keith Randall e, portanto, em Python. Esta solução pode resolver todos os 5 casos de teste com uma soma total de menos de 400 movimentos e outros quebra-cabeças também. Ele contém uma solução otimizada e uma força bruta. O código já está um pouco inchado. A saída é abreviada como "llururd .." Espero que seja útil. http://www.penschuck.org/joomla/tmp/15Tile.txt (explicação) http://www.penschuck.org/joomla/tmp/tile15.txt (código python)
fonte