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

在这里插入图片描述

解题思路:
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标记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个迷你ASP.NET Core框架的实现(下)

【框架内幕】| 作者 / Edison Zhou这是恰童鞋骚年的第196篇原创文章上一篇我们了解了AspNetCore.Mini这个项目的背景及项目结构和流程&#xff0c;这一篇我们继续解析几个核心对象。本文整理自A大&#xff08;蒋金楠&#xff09;的主题分享&#xff0c;点击本文底部“阅读原文”…

CoreJava 笔记总结-第七章 异常,断言和日志

文章目录第七章 异常,断言和日志处理错误异常的分类声明检查型异常如何抛出异常创建异常类捕获异常捕获单个异常捕获多个异常再次抛出异常和异常链finally子句try-with-Resource语句分析堆栈轨迹元素使用异常的技巧使用断言使用断言完成参数检查日志基本日志高级日志调试技巧第…

根据后序和中序求二叉树的先序

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int in_order[N], post_order[N], lch[N], rch[N];int build(int inL, int inR, int postL, int postR) {if (inL > inR)return 0;int root post_order[postR];int k inL;while…

CoreJava 笔记总结-第九章 集合

第九章 集合 文章目录第九章 集合Java集合框架集合接口与实现分离Collection接口迭代器泛型实用方法集合框架中的接口具体集合链表数组列表散列集树集优先队列映射映射的基本操作更新映射条目映射视图弱散列试图链接散列集与映射枚举集与映射标识散列映射视图与包装器小集合子范…

30多岁程序员老W,无奈选择转行!问题出在哪?

作者&#xff1a;邹溪源&#xff0c;长沙资深互联网从业者&#xff0c;架构师社区特邀嘉宾&#xff01;一有一天&#xff0c;一位同事跟我说&#xff1a;老w已经改行做美缝去了&#xff0c;你怎么看&#xff1f;我想了想&#xff0c;说&#xff1a;他大概终于做出了眼下最符合他…

一维前缀和

代码如下&#xff1a; #include <iostream> using namespace std; const int N 1010; int a[N], s[N];int main() {int n;cin >> n;for (int i 1; i < n; i) {cin >> a[i];//原数组s[i] s[i - 1] a[i];}for (int i 1; i < n; i)cout << s[…

HttpClientFactory的套路,你知多少?

背景ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory。替换的初衷还是简单摆一下&#xff1a;① using(var client new HttpClient()) 调用的 Dispose() 方法并不会立即释放底层 Socket 连接&#xff0c;新建 Socket 需要时间&a…

CoreJava 笔记总结-第十二章 并发-1

第十二章 并发 线程 package chapter12_concurrent.threads;public class ThreadsTest {public static final int DELAY 10;public static final int STEPS 100;public static final double MAX_AMOUNT 1000;public static void main(String[] args) {var bank new Bank(…

走迷宫-双向bfs解法

双向bfs适用于知道起点和终点的状态下使用&#xff0c;从起点和终点两个方向开始进行搜索&#xff0c;可以非常大的提高单个bfs的搜索效率同样&#xff0c;实现也是通过队列的方式&#xff0c;可以设置两个队列&#xff0c;一个队列保存从起点开始搜索的状态&#xff0c;另一个…

.NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记...

16 | 选项数据热更新&#xff1a;让服务感知配置的变化选项框架还有两个关键类型&#xff1a;1、IOptionsMonitor2、IOptionsSnapshot场景&#xff1a;1、范围作用域类型使用 IOptinsSnapshot2、单例服务使用 IOptionsMonitor通过代码更新选项&#xff1a;IPostConfigureOption…

CoreJava 笔记总结-第十二章 并发-2

文章目录第十二章 并发synchronized关键字同步块监视器概念volatile字段final变量原子性死锁线程安全的集合阻塞队列映射条目的原子更新对并发散列映射的批操作并行数组算法同步包装器任务和线程池Callable, FutureExecutor执行器fork-in框架异步计算可完成Future组合可完成Fut…

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

问题描述&#xff1a; 在33的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有1至8的某一数字。棋盘中留有一个空格&#xff0c;空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a; 给出一种初始布局&#xff08;初始状态&#xff09;和目标布…

华为任职资格_看了华为的任职资格体系,你就明白员工为啥这么拼?

提到华为的18万奋斗者&#xff0c;职场上没人不竖起大拇指。而优秀人才的背后&#xff0c;就像任正非曾说过的那样&#xff0c;华为的成功&#xff0c;很大意义上讲就是人力资源的成功。华为的人力资源管理最有代表性的&#xff0c;除了狼性文化和薪酬绩效外&#xff0c;就是任…

如何使用有序GUID提升数据库读写性能

源宝导读&#xff1a;数据库设计时&#xff0c;经常会使用GUID作为表的主键&#xff0c;但由于GUID的随机性会导致数据库在读写数据时效率严重下降&#xff0c;影响应用程序整体性能。本文将深入探讨如何通过使用有序GUID提升数据读写的性能。一、背景常见的数据库设计是使用连…

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

问题描述&#xff1a; 在33的棋盘上&#xff0c;摆有八个棋子&#xff0c;每个棋子上标有1至8的某一数字。棋盘中留有一个空格&#xff0c;空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是&#xff1a; 给出一种初始布局&#xff08;初始状态&#xff09;和目标布…

MarkDown语法, 快捷键,Dos命令

文章目录MarkDown 语法计算机软件快捷键Dos命令MarkDown 语法 字体: 斜体, 粗体, 删除图片: ![title](link)超链接: [words](link)引用>标题列表表格 名字|性别|生日 31辅导班VS看复旦南开都是vs1ds代码块 分割线*** 计算机软件 系统软件应用软件DOS, Windows, Unix,…

《商业洞察力30讲》学习笔记(上)

【洞察力】| 作者 / Edison Zhou这是恰童鞋骚年的第197篇原创文章学习洞察力&#xff0c;也是新时代IT人员的一门进阶必修课...1学习背景2019年下半年至今&#xff0c;在领导的推荐下学习了刘润老师的《商业洞察力30讲》&#xff0c;刷新了我对于事物的认知&#xff0c;也为我提…

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

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

3月数据库排行:前10整体下行,出新技术了?

DB-Engines 数据库流行度排行榜 3 月更新已发布&#xff0c;排名前二十如下&#xff1a;排名方面没有任何变动&#xff08;仅针对前十&#xff09;&#xff0c;相信很长一段时间内也都不会变动&#xff0c;毕竟巨头的位置不是一时半刻就能动摇的。不过这个月的排行榜还是有值得…

CSS3动画大全(附源码)flex布局,grid布局3d旋转,图像模糊,文字发光

CSS3动画大全(附源码)3d旋转,图像模糊,文字发光! 文章目录CSS3动画大全(附源码)3d旋转,图像模糊,文字发光!html代码cssgrid布局flex布局文字发光 & 图像放缩3d旋转 图像移动源码html代码 <body><div class"container"><div class"main"…