8 bulmacayı çöz


13

8 Puzzle, 15Puzzle'ın (veya Sliding puzzle'ın ) daha küçük çeşididir . 3x3Rastgele sırada düzenlenmiş 0-8 (0 boş döşemeyi ifade eder) sayılarla dolu bir ızgaraya sahipsiniz . Göreviniz 3x3 ızgarası girmek ve hedef durumuna ulaşmak için en kısa çözümü (minimum hamle) göstermektir. Çıktıdaki ilk durum da dahil olmak üzere her bir pano durumunu görüntüleyin.

Birden fazla optimum çözüm olabilir, sadece bir tane yazdırmanız gerekir.

Girdi: (küçük örnek)

1 2 0
4 5 3
7 8 6

Çıktı:

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

Bulmaca çözülemezse, sadece yazdırın -1(çözülemez)

Düzenleme : Zaman sınırı: <30 saniye.


Npuzzle'a aşina olmayanlar için lütfen verilen bağlantıyı okuyun ...
st0le

sorunuzu, olmamalıdır grid which is filled with numbers from 0-9olmak grid which is filled with numbers from 0-8?
Clyde Lobo

@Clyde, Hata! :) Sabit.
st0le

Çözmenin her zaman mümkün olduğuna eminim, değil mi?
Sihirli Ahtapot Urn

@MagicOctopusUrn Sürükleme kurallarını kullanarak Hedef durumundan ilk duruma geldiyseniz, her zaman çözülebilir. Eğer keyfi olarak fayans koyarsanız, çözülemeyecek durumlar vardır. N için Google için Çözülebilirlik yapboz
st0le

Yanıtlar:


6

Python, 418 karakter

Kod, tüm konumları kapsamlı bir şekilde numaralandırır ve derinliklerinin haritalarını (D) ve çözülene (E) daha yakın bir konum yapar. Sonra çıktıyı almak için hedef durumuna bakar.

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

' '*3hile gibi .
st0le
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.