解决8个难题


13

8拼图是15Puzzle(或滑动拼图)的较小变体。您有一个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 2011年

在你的问题,不应该grid which is filled with numbers from 0-9grid which is filled with numbers from 0-8
克莱德·罗伯

@克莱德,糟糕!:)固定。
st0le 2011年

可以肯定总是有可能解决的,对吗?
魔术章鱼缸

@MagicOctopusUrn如果您使用滑动规则从“目标”状态到达初始状态,则始终可以解决。如果您随意放置磁贴,那么有些状态是无法解决的。Google解决n个难题的方法
st0le

Answers:


5

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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.