Risolvi l'8 Puzzle


12

8 Puzzle è la variante più piccola del 15Puzzle (o del puzzle scorrevole ). Hai una 3x3griglia che è piena di numeri da 0 a 8 (0 indica la tessera vuota) disposta in un ordine casuale. Il tuo compito è inserire una griglia 3x3 e mostrare la soluzione più breve (mosse minime) per raggiungere lo stato obiettivo. Visualizza ogni boardstate incluso il primo stato nell'output.

Potrebbero esserci più soluzioni ottimali, devi solo stamparne una.

Input: (piccolo esempio)

1 2 0
4 5 3
7 8 6

Produzione:

2 <- denotes minimum number of moves required
1 2 0
4 5 3
7 8 6

1 2 3
4 5 0
7 8 6

1 2 3
4 5 6
7 8 0 <- goal state

Se il puzzle non può essere risolto, stampa solo -1(indicando irrisolvibile)

Modifica : limite di tempo: <30 secondi.


Per coloro che non hanno familiarità con il npuzzle, si prega di leggere il link fornito ...
st0le

nella tua domanda, non dovrebbe grid which is filled with numbers from 0-9essere grid which is filled with numbers from 0-8?
Clyde Lobo

@Clyde, Oops! :) Risolto.
via

Abbastanza sicuro che sia sempre possibile risolvere, giusto?
Magic Octopus Urn

@MagicOctopusUrn Se sei arrivato allo stato iniziale dallo stato Obiettivo usando le regole di scorrimento, è sempre risolvibile. Se inserisci arbitrariamente le tessere, ci sono stati che non possono essere risolti. Google for Solvability for n puzzle
st0le

Risposte:


4

Python, 418 caratteri

Il codice elenca esaustivamente tutte le posizioni e crea mappe della loro profondità (D) e una posizione più vicina alla risoluzione (E). Quindi cerca lo stato dell'obiettivo per ottenere l'output.

D={(1,2,3,4,5,6,7,8,0):0}
E=D.copy()
def Z(a,d):
 b=list(a);b[i],b[i+d]=b[i+d],0;b=tuple(b)
 if b not in E:E[b]=a;D[b]=D[a]+1
for x in' '*32:
 for a in E.copy():
  i=list(a).index(0)
  if i>2:Z(a,-3)
  if i%3:Z(a,-1)
  if i%3<2:Z(a,1)
  if i<6:Z(a,3)
g=[]
for x in' '*3:g+=map(int,raw_input().split())
g=tuple(g)
if g in E:
 print D[g]
 while g:
  for i in(0,3,6):print'%d %d %d'%g[i:i+3]
  g=E[g];print
else:print -1

come il ' '*3trucco.
1111
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.