八数码问题(bfs)

 方式一:string存储状态

题目传送门:845. 八数码 - AcWing题库

BFS适用于边权为1的最短路问题 ,而这题要求最少的交换次数,将每一次的九宫格状态当作一个“状态结点”,由当前这个结点可以扩展出其它状态【即 x 可以与其上下左右(若存在的话)交换】,每一种可能的交换都将是bfs“踏出的下一步结点”。

这题难在如何存储状态,并且同一种状态将会有多种方式得出,需要 “ 去重 ” 保存状态,每一个状态对应到达该状态的最短路(即x的交换次数)是多少,于是我们想到用map来存【状态-步数】,同样bfs队列里也加入到达的状态,九宫格的状态可以用字符串来表示。

编码阶段:九宫格转换为字符串存储

解码阶段:字符串转换为九宫格后  ,再加以交换操作

编码和解码的转换通过stirng的下标 与 九宫格的横纵坐标的联系来实现:设字符 x 在string中的下标为t,则在九宫格a中为 a[t/3][t%3] 。(下标都从0开始)同样地,九宫格中某个数字的横纵坐标分别为x和y,则其在sting中存储的下标应为 x*3+y。

本题还学到了swap交换的对象之广泛,可以直接对string中的两个字符做交换。

(此外unordered_map在此题中比普通map要快)

 上代码:

#include<iostream>
#include<queue>
#include<string>
#include<unordered_map>
using namespace std;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};    //下标偏移数组,分别对应x的上右下左
unordered_map<string,int> mp;
queue<string> q;
int bfs(){string s;while(!q.empty()){s=q.front();q.pop();int stp=mp[s];if(s=="12345678x")return stp;int t=s.find('x');  //寻找下标int x=t/3, y=t%3;   //由下标得到横纵坐标for(int i=0,tx,ty;i<4;i++){tx=x+dx[i];ty=y+dy[i];if(tx<0||tx>=3||ty<0||ty>=3)continue;//注意此处是>=3不是>3int t2=tx*3+ty;     //转换为横纵坐标swap(s[t],s[t2]);if(!mp.count(s)){   //判重mp[s]=stp+1;q.push(s);}swap(s[t],s[t2]);}}return -1;
}
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);string s,t;for(int i=0;i<9;i++){cin>>t;s+=t;}q.push(s);mp[s]=0;cout<<bfs();return 0;
}

 

 方式二:用一个数(long long)存储状态

当然,这个适合输入全是数的情况(如x换为0)

题目传送门:P1379 八数码难题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

 犯过的错就是,注意横纵坐标对应,从0开始存的就横纵坐标<3,从1开始存的就<=3 QAQ

直接上代码:

#include<iostream>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
map<ll,int> mp;
queue<ll> q;
int dx[]={-1,0,1,0},dy[]={0,1,0,-1},a[5][5];
ll t;
int bfs(){while(!q.empty()){t=q.front();q.pop();int stp=mp[t], x, y;if(t==123804765)return stp;//数转矩阵 for(int i=3;i>0;i--){for(int j=3;j>0;j--){a[i][j]=t%10;t/=10;if(!a[i][j])x=i, y=j;}}for(int i=0,tx,ty;i<4;i++){tx=x+dx[i];ty=y+dy[i];if(tx<1||tx>3||ty<1||ty>3)continue;swap(a[x][y],a[tx][ty]);//矩阵转数t=0;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){t=t*10+a[i][j];}} if(!mp.count(t)){mp[t]=stp+1;q.push(t);}swap(a[x][y],a[tx][ty]);}}
}
int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);//可忽略,关同步流来提速的cin>>t;q.push(t);mp[t]=0;cout<<bfs();return 0;
}

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

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

相关文章

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

layui在上传多图时,allDone方法只是在第一次全部成功时调用了

问题点&#xff1a;在使用layui框架做多张图片上传时&#xff0c;遇见只有第一次操作上传图片时&#xff0c;触发了allDone全部上传成功的方法&#xff0c;后面再添加图片时&#xff0c;就不会调用这个方法 原因&#xff1a;是因为我删除了 choose 方法&#xff0c;并且也没有将…

flutter升级3.10.6Xcode构建报错

flutter sdk 升级Xcode报错收集&#xff0c;错误信息如下&#xff1a; Error (Xcode): Cycle inside Runner; building could produce unreliable results.没问题版本信息&#xff1a; Xcode&#xff1a;15.3 flutter sdk &#xff1a;3.7.12 dart sdk&#xff1a;2.19.6 …

真实的招生办对话邮件及美国高校官网更新的反 AI 政策

这两年 ChatGPT 的热度水涨船高&#xff0c;其编写功能强大&#xff0c;且具备强大的信息整合效果&#xff0c;所以呈现的内容在一定程度上具备可读性。 那么&#xff0c;美国留学文书可以用 ChatGPT 写吗&#xff1f;使用是否有风险&#xff1f;外网博主 Kushi Uppu 在这个申…

自动化高并发抓取淘宝平台商品数据(内附接入key密钥API响应示例)

通过API接口&#xff08;接入key&#xff0c;密钥&#xff09;&#xff0c;可以获取商品的标题、价格、图片、描述等详细信息。 item_get 获得淘宝商品详情item_get_pro 获得淘宝商品详情高级版item_review 获得淘宝商品评论item_fee 获得淘宝商品快递费用item_password 获得…

设计模式浅析(十) ·设计模式之迭代器组合模式

设计模式浅析(十) 设计模式之迭代器&组合模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 案例 有两家门店&#xff0c;门店A呢只提供早餐&#xff0c;门店B呢只提供午…

mysqldump: Got error: 1049: Unknown database ‘root‘ when selecting the datab

1.问题描述 MySQL版本号&#xff1a;MySQL Server 8.3MySQL持久化到处数据库结构及数据 mysqldump: Got error: 1049: Unknown database root when selecting the datab2.问题解决 cmd 切换本地路径 cd /d D:\Program Files\MySQL\MySQL Server 8.3\bin执行数据库备份命令 …

大话设计模式——9.单例模式(Singleton Pattern)

简介 确保一个类只有一个实例&#xff0c;并提供全局访问点来获取该实例&#xff0c;是最简单的设计模式。 UML图&#xff1a; 单例模式共有两种创建方式&#xff1a; 饿汉式&#xff08;线程安全&#xff09; 提前创建实例&#xff0c;好处在于该实例全局唯一&#xff0c;不…

R语言lavaan结构方程模型在生态学研究中的应用介绍及要点回顾

除了一般的线性回归外&#xff0c;SEM可以用于探究&#xff1a;测量不变性&#xff08;Measurement invariance&#xff09;、多组模型&#xff08;Multiple group modelling)、潜在增长模型&#xff08;Latent growth modeling&#xff09;、非线性混合模型&#xff08;Nonlin…

大语言模型上下文窗口初探(下)

由于篇幅原因&#xff0c;本文分为上下两篇&#xff0c;上篇主要讲解上下文窗口的概念、在LLM中的重要性&#xff0c;下篇主要讲解长文本能否成为LLM的护城河、国外大厂对长文本的态度。 3、长文本是护城河吗&#xff1f; 毫无疑问&#xff0c;Kimi从一开始就用“长文本”占领…

C++中的vector与C语言中的数组的区别

C中的vector和C语言中的数组在很多方面都有所不同&#xff0c;以下是它们之间的一些主要区别&#xff1a; 大小可变性&#xff1a; vector是C标准模板库&#xff08;STL&#xff09;提供的动态数组容器&#xff0c;它的大小可以动态增长或减少。这意味着你可以在运行时添加或删…

数据结构__顺序表和单链表

顺序表的改进 问题&#xff1a; 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当前容量为100&#xff0c;满了…