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

思路链接:
https://blog.csdn.net/qq_41636123/article/details/83010868

代码如下:

#include <iostream>
#include <queue>
#include <map>using namespace std;const int N = 4;
int mp[N][N];
map<int,int>vis;
map<int,int>step;
int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};//上 右 下 左
int r,c;//row,col
bool move_can(int u,int d)//判断空格能不能走
{for (int i = 2;i>=0;i--)for (int j = 2;j>=0;j--){mp[i][j] = u%10;u = u/10;if (mp[i][j]==0){r = i;c = j;//记录空格的位置}}if ((d==0 && r==0) || (d==1 && c==2) || (d==2 && r==2) || (d==3 && c==0) )return false;//我们控制空格移动,如果空格越界就return falsereturn true;
}int move_to(int u,int d)//进行空格交换,然后标记
{int xx = r +dx[d];int yy = c+dy[d];mp[r][c] = mp[xx][yy];mp[xx][yy] = 0;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 bfs(int u)
{queue<int>q;vis[u] = 1;step[u] = 0;q.push(u);while(q.size()){int next = q.front();q.pop();if (next==123456780) return step[next];for (int i = 0;i<4;i++){if (move_can(next,i)){int v = move_to(next,i);if (!vis[v]){vis[v] = 1;step[v] = step[next]+1;q.push(v);}}}}return -1;
}int main()
{int state = 0;for (int i = 0;i<3;i++)for (int j = 0;j<3;j++){cin>>mp[i][j];state = state*10+mp[i][j];//将输入的数转换以后标记}cout<<bfs(state)<<endl;return 0;
}

让我们看看如果换一种输入方式,要怎么写呢?

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

八数码问题I-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. 八数码问题II-bfs和map标记

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

  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. 【新拟态】左上角标签样式、ICON图标样式、模仿AppStore的应用图标
  2. 用Javascript代码实现浏览器菜单命令(以下代码在 Windows XP下的浏览器中调试通过
  3. 分布式下的session问题
  4. java 类编译_Java类编译、加载、和执行机制
  5. python正则表达式怎么用_python正则表达式的使用
  6. 201409-3-字符串匹配
  7. JS来推断文本框内容改变事件
  8. CSS3淘宝支付成功打勾动画代码
  9. 【英语学习工具】学习英语硬背硬记太难了, 在这里解说 LeHoCat 提供免费的 视频集 工具的使用方法, 看视频学英语的工具, 制作英语教学课件的工具, 帮助自学英语(详细图文)第2版
  10. 抖音特效专场PR模板 Premiere视频转场过渡快速切换画面视频模板下载
  11. 【计算机网络】数据链路层 : ALOHA 协议 ( 纯 ALOHA 协议 | 时隙 ALOHA 协议 )
  12. 神经网络的权重初始化,神经网络的权值和阈值
  13. 【BJOI2019】勘破神机【数论】
  14. wav数据提取 matlab,matlab 读取处理 wav 文件
  15. jdk9、jdk10、jdk11、jdk12、jdk13新特性
  16. Java如何在main方法中实例化内部类对象
  17. 原生jq下载文件的方式
  18. 【计算机网络-数据链路层】介质访问控制协议(MAC协议)
  19. 【2020年高被引学者】 宋令阳 北京大学
  20. 程序员的精神家园——码农餐厅(一)

热门文章

  1. SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容
  2. C语言试题八十三之输出左下三角形九九乘法表
  3. Android之在Activity中动态得到Adapter类中数据
  4. LeetCode之Find the Difference
  5. Android之ButterKnife--View注入框架
  6. java解析xml生成表格_JAVA读取XML文件并解析 以及 JAVA生成文本文件输出
  7. win下nginx+php+mysql服务器套装_WNMP(Windows+Nginx+PHP+MySQL)安装
  8. 产品运行所需的信息检索失败_禁煤后用什么替代锅炉?看看三种热源运行费用对比就知道了...
  9. 这些潮汕美食你吃过没有?
  10. 清华放大招!竟然连初三学生都招,一条龙培养到博士,还不准转专业......