问题描述:
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:
给出一种初始布局(初始状态)和目标布局(设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入

输入初始状态,一行九个数字,空格用0表示

输出

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(一定能到达目标状态)

样例输入

283104765

样例输出

4

解题思路:
这题与八数码问题I-bfs和map标记的区别就是输入方式换了,这样子输入,有种情况比如028137465(随便举的例子),由于第一个元素是0,所以我们用%去最后面的元素的时候,我们取不到0,所以我们用另外一种方式取,每次取第一个元素,将输入的数除以100000000,就可以得到第一个元素,然后%10得到就好了。

代码如下:

#include <iostream>
#include <queue>
#include <map>
using namespace std;
map<int, int>dis;
map<int, int>vis;
int e = 123804765;
int n;
int mp[4][4];
int ans;
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int r, c;void  fff1(int t) {int div = 100000000;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {mp[i][j] = (t / div) % 10;if (mp[i][j] == 0) {r = i;c = j;}div = div / 10;}
}int fff2() {int tmp = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {tmp = tmp * 10 + mp[i][j];}return tmp;
}int  dbfs(int s) {if (s == e)//一开始就是终止状态,就直接返回0return 0;vis[s] = 1;//从起点开始搜标记为1vis[e] = 2;//从终点开始搜标记为2dis[s] = 0, dis[e] = 1;//这里终点距离为1,很容易想到是因为什么!想不到可以留言,我来帮你解答queue<int>q1, q2;q1.push(s);q2.push(e);while (q1.size() && q2.size()) {bool flag = 0;int t ;int v;if (q1.size() < q2.size()) {t = q1.front();q1.pop();flag = 1;} else {t = q2.front();q2.pop();flag  = 0;}fff1(t);for (int i = 0; i < 4; i++) {int xx = r + dx[i], yy = c + dy[i];if (xx >= 0 && xx < 3 && yy >= 0 && yy < 3) {swap(mp[xx][yy], mp[r][c]);v = fff2();if (!dis.count(v)) {dis[v] = dis[t] + 1;vis[v] = vis[t];if (flag)q1.push(v);elseq2.push(v);//相遇} else if (vis[v] + vis[t] == 3) {ans = dis[v] + dis[t];return ans;}swap(mp[xx][yy], mp[r][c]);}}}return -1;
}int main() {cin >> n;cout << dbfs(n) << endl;return 0;
}

八数码问题II-bfs和map标记相关推荐

  1. 八数码问题II-双向bfs和map标记

    问题描述: 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是: 给出一种初始布局(初始状态)和目标布局( ...

  2. 人工智能作业 八数码启发式搜索与bfs比较

    问题描述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,只能通过棋牌向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋牌才能从初始布 ...

  3. hdu1043 经典的八数码问题 逆向bfs打表 + 逆序数

    题意: 题意就是八数码,给了一个3 * 3 的矩阵,上面有八个数字,有一个位置是空的,每次空的位置可以和他相邻的数字换位置,给你一些起始状态 ,给了一个最终状态,让你输出怎么变换才能达到目的. 思路: ...

  4. 移动拼图游戏(八数码问题) BFS版

    小时候玩过的移动拼图游戏.有一个3*3的棋盘,其中有0-8这9个数字,0表示空格,每次移动只能把空格旁边的数字移到空格,即与0相邻的数字可以和0交换位置. 求从初始状态 2 3 0 7 1 6 5 8 ...

  5. [蓝桥杯][历届试题]九宫重排-双向bfs和map标记

    题目描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中.经过若干次移动,可以形成第二个图所示的局面. 我们把第一个图的局面记为:12 ...

  6. 八数码问题I-bfs和map标记

    解题思路: bfs,将棋盘转化成一个整数表示其状态,比如我们到到达的状态是815736402,而样例给的输入状态是264137058,因为这些整数过大,标记数组开不下,所以可以用map来代替数组,写得 ...

  7. C++解题报告:详解经典搜索难题——八数码问题( 双向BFS A* 求解)

    引言 AC这道八数码问题,你和楼教主就是兄弟了... 题目描述 在一个3*3的九宫格棋盘里,放有8个数码,数码的数字分别是1~8.棋盘中还有一个位置是空着的,用0表示.可以通过在九宫格里平移数码来改变 ...

  8. 八数码(有一个空的移动拼图模型+map.count的用法)

    Problem J 八数码 时限:5000ms 内存限制:20000K 总时限:10000ms 描述: 在九宫格里放在1到8共8个数字还有一个是空格,与空格相邻的数字可以移动到空格的位置,问给定的状态 ...

  9. 习题:八数码难题(双向BFS)

    八数码难题(wikioi1225) [题目描述] 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出 ...

最新文章

  1. 高数_解二元方程,复数怎么求出来的?(复数问题)
  2. java nio 断开连接_浅尝Java NIO与Tomcat连接调优
  3. Noticaition 1.0 正式发布了
  4. InfluxDB基本概念和操作
  5. Java爬虫——网易云热评爬取
  6. 张雪峰计算机科学与技术学什么,张雪峰看好的三大专业是什么 前景好的专业...
  7. Docker volume使用
  8. openssh-在win7上的搭建
  9. Python 编程规范 —— TODO 注释(结合 PyCharm)
  10. hdu 2550 百步穿杨(大水题)
  11. 关于SQL的重复记录问题
  12. (Python语法篇)1.Python简介
  13. 事业单位计算机岗位考公基吗,【事业单位】江苏统考考什么?公基、言语……题量分布!...
  14. STM32f407 DCMI方式驱动 OV2640
  15. React Native入门——布局实践:开发京东客户端首页
  16. The server time zone value xxxxxxx is unrecognized or represents more than one time zone.
  17. centos——记录一次开机启动设置
  18. 富途证券后端PHP面经
  19. springboot多环境配置--bunny0728
  20. 关于Sun公司的SCJP认证

热门文章

  1. Android之各个手机版本WiFi热点的创建
  2. linux c之fdopen(int fd, const char *type)使用总结
  3. Android之退出应用关闭项目每个Activity的总结
  4. 数据库oracle 别名不能更新,数据库oracle改成mysql后Hibernate不能使用别名问题
  5. 王道408数据结构——第五章 树与二叉树
  6. excel中调用python程序_一篇文章带你使用Python搞定对Excel表的读写和处理
  7. 4部“教材级”纪录片,有生之年必看系列!
  8. 你根本想象不到,学霸到底经历过什么
  9. 国内各大平台的推荐算法,看到360的时候笑喷了……
  10. 荐号 | 11个人工智能与大数据相关的个人、企业优质号