八数码问题

八数码就是指在一个3*3的棋盘中有1-8八个数字和一个空格,空格可以与相邻(如果存在)的四个格子交换,得到形如"12345678(空格)"的状态.因为只有九个数字,九个格子,总状态数不会超过9!=326880种.解法可以用深搜,广搜,启发式搜索等等...之所以写八数码是因为在2008 TopCoder China Tournarment Round 1E的1000分的题就是关于八数码的.当时没做出来,想去google search one code...结果打成八码数了,死活就一两个结果,这RP...比赛完才发现打错字了.后大四一学长说这是人工智能课里的一个例子.人工智能好像是下学期的课...不管了.在POJ上也有一道关于八数码的题,网址如下:POJ 1077 : Eight  在TC里面ACRush的1000分的题得分最高,看了他的代码,受益良多.教主境界果然和我们小菜就是不一样.代码短,速度快.照着ACRush的思路 写了一个往TC上交了,运行Run System Test 就AC了,后来又上POJ看1077,花了很长时间写出了下面的代码,POJ上时间卡得蛮紧的...放这里,留个纪念吧.发现TC也蛮好玩的,虽然现在还很菜...经过2008 TopCoder China Tournarment的三场比赛和Round 2,终于变蓝了,下次就是DIV1了,得做好被"虐"的心理准备..

如下所示初始状态:

123
485
76.

存在一个最优移动步骤如下: 
123         123         123        123        123
485  -->  485  -->  4.5  -->  45.  -->  456
76.          7.6          786        786        78.

 下面是用广搜解法(POJ 1077):数据输入方式为按行优先,空格用x替代.

 

八数码(广搜)

posted @ 2008-12-15 13:13  MasterLuo  阅读(3002)  评论(4)    收藏  举报