八数码问题的广度优先搜索方法

问题的简单描述
  • 3×3九宫qipan,放置数码为1 -8的8个棋子,剩下一个空格,只能通过向空格的移动来改变九宫格的布局。

要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动qipan才能从初始布局到达目标布局,找到合法的走步序列。

功能设计
  • 可计算这两个有序数列的逆序值,如果两者都是偶数或奇数,则可通过变换到达,否则,这两个状态不可达。这样,就可以在具体解决问题之前判断出问题是否可解,从而可以避免不必要的搜索。

  • 本次使用广度优先搜索方案解决该问题,保存每次走完之后的数组以及由上一步到达这一步所经历的步骤(即空格的上下左右移动方向),空格的约束是不能移出qipan

变量设计
  • 首先是每个节点的设计

    struct node
    {// 表示一个九宫格int xy[3][3];//dir的 0 1 2 3分别代表上一步是如何移动得来:左 上 右 下int dir;
    };
    复制代码
  • 接着是其余所需变量

    // 表示最多可以走的步数,可以随意设置数组最大值
    struct node step[102], end;// 表示当前搜索的次数
    int count = 1;
    复制代码
算法设计
  • 首先将 step[0] 赋值,然后设置一个最大的步数,然后将目标节点位置初始化到这个 node 中。也就是给 step[101] 赋值。
  • 然后经过对 0 的上下左右移动来判断是否达到目标值(注意的是如果0是由上到下移动得来,则下一步就不能够再向上移动,否则会与父节点冲突),如果走完了所有的步数都还没能找到,则传递找不到信息
  • 如果在这过程中找到了目标值(判断目标值是否相等的方法使用了一个 long long 数字来将九宫格中每个数字 * 10的 n次幂 然后相加得到一个唯一的值),则打印出目标值并且程序结束。
关键代码
  • 首先是找出 0 的位置

    //找出0的位置,参数 num 表示的是第几次的移动
    int loction(int num) {int i;for (i = 0; i < 9; i++)
    //        返回的是 0 在 9 宫格中的位置数字 0 ~ 8if (step[num].xy[i / 3][i % 3] == 0) return i;printf("未能找到 0 位置");return -1;
    }
    复制代码
  • 对每一步操作后的九宫格数组进行唯一性标记

    long long sign(int num) {  // 这种标记采取了比较笨的方法,直接由每个格子里面的值相加生成了一个数字来表示坐标的唯一性long long  sum;sum = step[num].xy[0][0]*100000000 + step[num].xy[0][1]*10000000 + step[num].xy[0][2]*1000000 + step[num].xy[1][0]*100000 + step[num].xy[1][1]*10000 + step[num].xy[1][2]*1000 + step[num].xy[2][0]*100 + step[num].xy[2][1]*10 + step[num].xy[2][2];return sum;
    }
    复制代码
  • 对 0 数字进行上下左右移动,此时需要判定四个边界

    void move(int num) {int loc;// 首先确定 0 的位置loc = loction(num);// 记录这个九宫格已经走过的方向,也就是它是由父节点由哪个方向移动得来int stand = step[num].dir;// 判断是否可以继续向上并且上一步不是将 0 向上移动if (loc / 3 != 0 && stand != UP) {//        首先将当前的值赋给当前 num 步的下一步step[count] = step[num];// 交换 0 和 0 下方数字的位置step[count].xy[loc / 3][loc % 3] = step[count].xy[loc / 3 - 1][loc % 3];step[count].xy[loc / 3 - 1][loc % 3] = 0;step[count].dir = DOWN;count++;}// 判断下边界并且上一步的移动不是已经向下了,否则又会移动回和父节点一样的九宫格if (loc / 3 != 2 && stand != DOWN) {step[count] = step[num];// 将当前 0 与下边的位置的数字交换step[count].xy[loc / 3][loc % 3] = step[count].xy[loc / 3 + 1][loc % 3];// 将下边的数字换到原 0 位置处step[count].xy[loc / 3 + 1][loc % 3] = 0;// 方向改为向上step[count].dir = UP;count++;}// 判断左边界if (loc % 3 != 0 && stand != LEFT) {step[count] = step[num];// 将当前 0 位置与左边数字的位置交换step[count].xy[loc / 3][loc % 3] = step[count].xy[loc / 3][loc % 3 - 1];step[count].xy[loc / 3][loc % 3 - 1] = 0;step[count].dir = RIGHT;count++;}// 判断右边界if (loc % 3 != 2 && stand != RIGHT) {step[count] = step[num];step[count].xy[loc / 3][loc % 3] = step[count].xy[loc / 3][loc % 3 + 1];step[count].xy[loc / 3][loc % 3 + 1] = 0;step[count].dir = LEFT;count++;}}
    复制代码
主要功能界面截图

八数码问题的广度优先搜索方法相关推荐

  1. 八数码问题——双向广度优先搜索解决

    八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所看到的,要求对空格运行空格左移.空格右移.空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态. 搜索 ...

  2. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

  3. 八数码 || 九宫重排(A*搜索代码)

    八数码 || 九宫重排 废话: 这道题如果我们用bfs确实可以跑,但是大概率会炸掉,这道题是可以双向bfs,但今天我要展示的是用A*搜索的代码 策略分析: 1,标记: 既然是搜索,那我们就肯定就要加标 ...

  4. 8puzzle java 代码_八数码难题(8 puzzle)深度优先和深度优先算法

    1搜索策略 搜索策略是指在搜索过程中如何选择扩展节点的次序问题.一般来说,搜索策略就是采用试探的方法.它有两种类型:一类是回溯搜索,另一类是图搜索策略. 2盲目的图搜索策略 图搜索策略又可分为两种:一 ...

  5. 【广度优先搜索】一个实例+两张动图彻底理解 BFS | 思路+代码详解 | 用 DFS 自动控制我们的小游戏

    前言: 在 第一篇文章 中,我们讨论了 如何用 pygame 写一个小游戏,并用键盘交互控制 .接下来,我们将分别用 DFS .BFS .DRL 实现自动控制.DFS 已经在 这篇文章 中讨论过,现在 ...

  6. 小游戏系列算法之五广度优先搜索,双向广搜,八数码,华容道

    前段时间在玩仙五前,遇上了蚩尤冢拼图这个小游戏. 其实就是八数码问题,一直想着如何才能用最少步数求解,于是就写了个程序. Q1:什么是八数码问题? A1:首先假定一个3*3的棋盘(如上图),分别有1, ...

  7. 八数码深度优先搜索_深度优先搜索和广度优先搜索

    深度优先搜索和广度优先搜索 关于搜索&遍历 对于搜索来说,我们绝大多数情况下处理的都是叫 "所谓的暴力搜索" ,或者是说比较简单朴素的搜索,也就是说你在搜索的时候没有任何所 ...

  8. 八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/

    已结贴√ 问题点数:100 回复次数:31 广度优先搜索解 , 求意见, 求bug/ 我得去买票了,.... #include #include #include #define NUM 5 type ...

  9. 多种方法求解八数码问题

    AI的实验报告,改了改发上来.希望路过的大牛不吝赐教.非常是纳闷我的ida*怎么还没有双搜快.还有发现基于不在位启示的A*和Ida*都挺慢.尤其是ida* 搜索31步的竟然要十几秒.是我写的代码有问题 ...

最新文章

  1. MNIST数据集合在PaddlePaddle环境下使用简单神经网络识别效果
  2. 华为数据通信部门怎么样_华为最高级别认证适合小白吗
  3. java 模拟grep_java模拟linux命令grep
  4. P3160:局部极小值(容斥、状压)
  5. uni-app自定义tabBar;uni-app小程序自定义tabBar;uni-app小程序修改中间tabBar导航栏大小;uni-app中间导航栏凸起;uni-app修改底部导航栏
  6. Java面试题15牛客 以下关于Integer与int的区别错误的是
  7. 吐血推荐 | 那些提升开发人员工作效率的在线工具
  8. java语言精通能干什么_Java学到什么程度才能叫精通?
  9. librdkafka 安装
  10. 《磐石计划:Web安全漏洞与渗透测试》笔记
  11. 土木专业应用计算机,计算机在土木中的应用
  12. groovy定义变量获取当前时间_Groovy 变量 (Groovy 教程) – Groovy教程 中文开发手册 - Break易站...
  13. C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)
  14. 2021正睿csp7连day2
  15. Idea 使用YapiUpload上传接口到Yapi
  16. 鲁大师2022牛角尖颁奖盛典落幕,年度最强产品揭晓!
  17. SQL中的DML、DDL以及DCL是什么?
  18. w11 php 环境变量
  19. Android 6.0以上动态申请文件读写权限
  20. OpenAcc的使用

热门文章

  1. 伺服电子齿轮比计算软件_电子科技大学软件考研 | 最新考试大纲解析计算机网络篇!...
  2. 数字图像处理-bmp与jpeg格式互相转换
  3. GBase 8a 数据迁移工具4--- Oracle数据迁移工具“orato8a”
  4. docker 搭建以太坊私有链搭建
  5. 刷Trailhead笔记- 用aura component创建app
  6. chrome浏览器会自动添加淘宝、京东等书签的解决方法
  7. Apache Hue基础知识大全
  8. 程序设计基石与实践之实现数字七段显示与发扑克牌问题
  9. 证书图片本地启动没事,Linux服务器启动中文乱码解决
  10. Shell-基础(一):Shell解释器、Shell脚本