八数码问题c语言代码问题 解释一下这个代码

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

八方块移动游戏要求从一个含8个数字(用1-8表示)的方块以及一个空格方块(用0表示)的3x3矩阵的起始状态开始,不断移动该空格方块以使其和相邻的方块互换直至达到所定义的目标状态。空格方块在中间位置时有上、下、左、右4个方向可移动在四个角落上有2个方向可移动,在其他位置上有3个方向可移动例如,假设一个3x3矩阵的初始状态为:

则一个合法嘚移动路径为:

另外在所有可能的从初始状态到目标状态的移动路径中,步数最少的路径被称为最短路径;在上面的例子中最短路径為5。如果不存在从初试状态到目标状态的任何路径则称该组状态无解。

请设计有效的(细节请见评分规则)算法找到从八方块的某初试狀态到某目标状态的所有可能路径中的最短路径并用C/C++实现。

给定一个一幅图和一个起点s回答“从s到给定的顶点v是否存在一条路径?如果有找出其中最短的那条(所含边数最少)。“

边数最少很自然想到从从经过1条邊能到达的节点有哪些?然后经过这些边再到达的节点有哪些这样我不就能够想出来最短的路径了吗?没错这是非常简单的想法,然洏真正的广度优先算法也是这样简单而有效。

上面这幅图我要找到从1到12的最短路径则我会从1经过1条边可以到达的节点(2 3 4)搜索,发现没有接下来搜索节点(2 3 4)通过1条边能够到达的顶点(5 6 7 8),发现没有接下来搜索节点(5 6 7 8),发现没有接下来搜索节点(5 6 7 8)通過1条边能够到达的节点(9 10 11 12),搜索到最后一个发现搜索到了。如果你每次经过一条边则记录加1则现在经过了三条边,即最短路径是3条邊

当已经理解了算法思想,接下来就应该实现了最重要的一步是思考使用什么样的数据结构,想想这里的搜索一个集合那洎然就是遍历他们,接下来还要遍历他们通过一条边能够到达节点普通的想法是先判断他们,如果没有则再遍历他们,然后生成的所囿节点再加入一个新的集合当中

问题:发现了没,这里遍历了两遍集合还有就是新的节点加入一个新的集合,每次都要声明新的数组嗎这是有多麻烦。

解决方案:这里遍历了两遍其实我先生成新的节点和后生成新的节点只是多占用一点空间而已,我要是在遍历第一個节点如果判断不是就直接生成新的节点也可以这样就不用遍历第二遍了,加入新的集合解决起来有点棘手如果我可以仍然放在集合裏面继续遍历就好了,对!就是这样所以在集合里会有顺序的关系,不能我先遍历第一个节点接着直接遍历新的节点,所以说我们的數据就要有顺序之分所以想想有什么样的数据存储方式能够有顺序,常见的数组就够了如果稍微学过数据结构,链表也可以

编程的思路:遍历数组,从第一个节点开始如果不是,则生成新节点加入到数组的最后一个节点后面所以如果是八数码问题c语言代码,一定偠将数组声明大一些然后不断遍历即可,直到找到

八数码问题也称为九宫问题。在3×3的棋盘摆有八个棋子,每个棋子上标有1至8嘚某一数字不同棋子上标的数字不相同。棋盘上还有一个空格与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始狀态和一个目标状态找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。所谓问题的一个状态就是棋子在棋盘上的一种摆法解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。

移动棋子最少当然是使用广度优先搜索來解决。所以这里的每个节点就要是一个3
*3的矩阵如果在八数码问题c语言代码中,可以使用结构体

  • 接受初始节点的信息和目标節点的信息
  • 找到空白棋子很简单,直接遍历就好但是如何返回它的x和y坐标,试着能不能使用一个数字代替后来发现确实可以。
  • 从初始節点开始判断然后扩展,即上下左右移动当然我们要考虑具体的位置,比如说已经到边界了就不能越出边界。还要考虑以前移动过嘚方向所以记录下来以前移动过的方向,可以直接加在结构体里(代码如下所示)每次扩展的节点就加在数组后面。
  • 如何实现判断相等就是如何标志该状态的唯一性,方案1:9个数字拼接生成字符串直接判断是否相等方案二:由于数也不大,所以直接使用9个数字直接苼成一个数使用long long 声明生成的数字即可。
  • 如果保证能够到达目标节点可以一直搜索下去,如果不知道能不能则可以设置搜索次数。

这是因为八数码问题通常是求最優解而求最优解,就必须要用宽度优先搜索的方法才能找到如果用深度优先搜索,那是寻找一个任意的解由于搜索的空间十分巨大,而且在需要防止重复所以每一步都要检查,以去除重复这样整个最大的搜索空间更衣上会达到有36万种,但是在每一步去重的话这個时间复杂度就得到36万的平方。加上每一步的检查这个计算量不小,时间附杂度也是比较高的所以没有写错的话,也会消用很长的时間

所以说,还是使用宽度优先搜索的比较好而且,为了提高搜索的效率通常采用智能化的搜索。

我要回帖

更多关于 八数码问题c语言代码 的文章

 

随机推荐