8数码问题分析及程序代码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
八数码问题 问题描述 所谓八数码问题是指:将分别标有数字1,2,3,…,8的八块正方形数码牌任意地放在一块3×3的数码盘上。放牌时要求不能重叠。于是,在3×3的数码盘上出现了一个空格。现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则,将任意摆放的数码盘逐步摆成某种特殊的排列。 2、问题分析 首先,八数码问题包括一个初始状态(strat) 和 目标状态(goal),所谓解八数码问题就是在两个状态间寻找一系列可过渡状态(strat- strat 1- strat 2-...-goal)。这个状态是否存在就是我们要解决的第一个问题。如下是初使状态到目标状态图:(0表示空格) 1 2 3 4 5 6 7 8 0 1 2 3 7 4 5 8 0 6 图1 数据结构 定义结构体Node如下: typedef struct{ int num[9]; char cur_expension; //记录是否可以扩展,Y代表可以扩展,N代表不可以。 char Operate; //表示不可以执行的操作,L代表不能左移,R代表不能右移, //U代表不能上移,D代表不能下移,C代表可以任意移动。 int father; //记录父节点的下标。 }Node; Node state[MAXSIZE]; //将搜索过的状态存储于该数组中。 4、广度优先搜索 广度优先搜索是指按节点的层次进行搜索,本层的节点没有搜索完毕时,不能对下层节点进行处理,即深度越小的节点越先得到扩展,也就是说先产生的节点先得以扩展处理,直至找到目标为止。求解八数码问题的搜索过程:如图2所示,把所有可能的算符应用到开始节点(即空格上移、空格左移、空格右移、空格下移),图2只是演示了两个扩展结点,如此继续下去,直到发现目标节点。 1 2 34 5 6 7 8 0 1 2 3 4 5 6 7 8 0 图2 变量定义及函数说明: #define SUM 100//限定只搜索前50步,50步以后如果仍然没有搜索到结果,认为无解。 #define MAXSIZE 200 // 宏定义最大数组长度 int n=1; //用来记录搜索的步骤 int goal[9]={1,2,3,7,4,5,8,0,6};//所要达到的最终状态,0代表空格。 int same(int temp); //判断是否达到了目标状态。 void printgoal(); //输出搜索结果。 int left(int temp); //将空格进行左移操作。 int right(int temp); //将空格进行右移操作。 int up(int temp); //将空格进行上移操作。 int down(int temp); //将空格进行下移操作。 void init(); //初始状态参数设置 程序运行结果:从初始状态到目标状态走了42步。 6、源程序如下: //***************************************************** //程序名: game.cpp * //作 者:杨凤芝 * //编写时间:2009年11 //程序功能:八数码问题 * //***************************************************** #include iostream #include stdlib.h using namespace std; int same(int temp); //判断是否达到了目标状态。 void printgoal(); //输出搜索结果。 int left(int temp); //将空格进行左移操作。 int right(int temp); //将空格进行右移操作。 int up(int temp); //将空格进行上移操作。 int down(int temp); //将空格进行下移操作。 void init(); //初始状态参数设置 #define SUM 100//限定只搜索前100步,100步以后如果仍然没有搜索到结果,认为无解。 #define MAXSIZE 200 int n=1; int goal[9]={1,2,3,7,4,5,8,0,6};//所要达到的最

文档评论(0)

anma + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档