8パズルを解く


12

8パズルは、15Puzzle(またはSliding puzzle)の小さなバリエーションです。3x3ランダムな順序で配置された0〜8の数字(0は空白のタイルを示します)で埋められたグリッドがあります。あなたのタスクは、3x3グリッドを入力し、目標状態に到達するための最短の解決策(最小の移動)を表示することです。出力の最初の状態を含む各ボード状態を表示します。

最適なソリューションが複数ある場合がありますが、印刷する必要があります。

入力:(小さな例)

1 2 0
4 5 3
7 8 6

出力:

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

パズルを解決できない場合は、単に印刷します-1(解決不能を示します)

編集:制限時間:<30秒。


npuzzleに慣れていない方のために、リンク提供...お読みください
st0le

あなたの質問では、べきではないgrid which is filled with numbers from 0-9ことgrid which is filled with numbers from 0-8
クライドロボ

@クライド、おっと!:) 修繕。
-st0le

いつでも解決できると確信していますよね?
魔法のタコUr

@MagicOctopusUrnスライドルールを使用して目標状態から初期状態に到達した場合、常に解決可能です。arbitrarily意的にタイルを配置すると、解決できない状態があります。n個のパズルのための可解性のためにグーグル
st0le

回答:


4

Python、418文字

このコードは、すべての位置を網羅的に列挙し、それらの深さのマップ(D)、および位置に近いものを解決済み(E)にします。次に、目標状態を検索して出力を取得します。

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

' '*3トリックのように。
-st0le
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.