八数码游戏分析+源码——启发式搜索(一)

 八数码问题:

我想大家小时候一定玩过八数码的游戏,如下图:在一个九宫格里面放入8个数字,数字只能上下左右移动,并且只能移动到空白处。通过若干此移动后,能把数字移动成图1.1右方所示图案。

    图1.1(左边为开始格局,右边为移动后最终格局)

 

下图是图1.1下一个格局的三种情况:

                                                图1.2

 

如果按正常的思维,采用盲目搜索的话,不仅搜索的次数多,而且往往容易陷入死循环中,所以面对此问题需要一种策略——启发式搜索

启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路径,提高了效率

 

解决此问题的启发策略:

每次移动的时候,正确位置数码的个数要大于交换前正确位置数码个数。

正确位置数码个数:每个数码的位置与最终格局的对比,如果位置相同,则说明此数码在正确位置。

如下图:

图1.3

图1.3中右边为最终格局,左边为当前格局,红色字体标识的数码为 正确位置数码,由此可以发现其正确位置的数码个数为4个。那么图1.2中正确数码如下图所示:

 

 由上图所示可得,正确位置数码个数大于等于4的只有左下方的格局,那么下一步选择的就是左下方的格局,再次调用次算法如下图:

这样一步步的最终即可得到最终格局

源代码:

/*
程序名:八数码问题
作者:侯青青       完成时间:2010.7.5
描述:
主要函数列表:
      1.show()     显示当前待调整数码矩阵
	  2.exchange() 交换数码中的 begin[row_one][column_one] 与 begin[row_tw
  • 20
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值