news 2026/2/1 15:34:21

信息学奥赛一本通 1453:移动玩具 | 洛谷 P4289 [HAOI2008] 移动玩具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
信息学奥赛一本通 1453:移动玩具 | 洛谷 P4289 [HAOI2008] 移动玩具

【题目链接】

ybt 1453:移动玩具
洛谷 P4289 [HAOI2008] 移动玩具

【题目考点】

1. 广搜
2. 双向广搜
3. map

map存储键值对
由于map底层是红黑树(一种二叉搜索树),其键的类型必须可以比较,即键的类型支持"<"小于号运算符。

【解题思路】

解法1:广搜

本题以4*4二维数组作为状态,状态中包含了移动玩具的步数。
输入起始和目标状态。
设队列保存状态,将起始状态入队。
每次循环出队一个状态u uu,为当前状态。
从当前状态u uu出发,遍历二维数组中的每个位置。
如果当前位置是1,那么尝试将1向其上下左右四个方向移动,其目标移动位置必须在二维数组范围内,且目标位置为0。如果可以移动,那么将当前位置和目标位置的值交换,完成移动,得到新的状态t tt
对于新的状态t tt,先使用vis判断该状态是否出现过。如果该状态没有出现过,则记录到达该状态经过的步数dis,将t tt状态入队。而后进行下一次循环。
当出队的状态为目标状态时,返回到达目标状态的步数,即为本题的结果。

广搜过程中需要判断某一状态是否已经出现过。本题的状态为一个4*4二维数组,因此需要记录一个4*4二维数组是否出现过。
设Node类型保存状态,其中包含一个char类型的二维数组。
需要使用一组映射记录状态是否出现过。

方法1:键类型:Node,值类型:bool

由于map的键的类型必须可以比较,即实现"<"小于号运算符。我们需要对Node类型重载小于号运算符,使得两个Node类型对象可以使用小于号运算符进行比较。
其声明格式为:

booloperator<(constNode&b)const{//...}

注意:函数中的两个const必须写,这是map类的要求。
此处可以自己定义一种比较规则,即给定两个二维数组,你可以根据该规则说出哪个更大哪个更小即可。以下给出一个可行的比较规则。
可以按顺序依次比较两个状态的二维数组的每个对应位置的值。

  • 如果第一个数组中取到的值小于第二个数组中取到的值,返回真。
  • 如果第一个数组中取到的值大于于第二个数组中取到的值,返回假。
  • 如果第一个数组和第二个数组完全相同,也返回假。
方法2:键类型:string,值类型:bool

string类已经重载了小于号运算符,可以根据字典序规则比较两个字符串。
在Node类型中,将二维数组转为string。只需要遍历二维数组,将取到的字符连接为一个字符串即可。

解法2:双向广搜

可以从起始状态和目标状态同时出发进行广搜
首先将起始和目标状态同时入队。
vis为一个map,记录一个状态来源,即该状态是从哪个状态扩展得到的

  • 值为0表示该状态还没出现过。
  • 值为1表示该状态是从起始状态扩展得到的。
  • 值为2表示该状态是从最终状态扩展得到的。

该方法必须设一个独立的名为dis的map来记录到达一个状态的步数(无法把dis放在Node类中)。
搜索过程和广搜类似,
从当前状态u uu扩展得到一个新的状态t tt时:
如果t tt状态未出现过,那么将t tt状态的来源vis[t]设为和当前u uu状态的来源vis[u]相同。
如果t tt状态已出现过,且t tt状态的来源vis[t]和当前u uu状态的来源vis[u]不同,说明在解空间树上,从起始状态出发的路径和从目标状态出发的路径相遇。
从一个来源到u uu状态的步数为dis[u],从另一个来源到t tt状态的步数为dis[t],从起始状态到目标状态的总步数为dis[u]+dis[t]+1。将该值返回,即为问题的结果。

记录状态的方法,可以使用上述方法1:在Node中重载小于号运算符,而后将Node作为map的键。或使用方法2:将状态转为string,而后作为map的键。

【题解代码】

解法1:广搜+Node中重载小于号运算符
#include<bits/stdc++.h>usingnamespacestd;structNode{chara[5][5];intdis;//到达该状态的步数booloperator<(constNode&b)const{for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)if(a[i][j]!=b.a[i][j])returna[i][j]<b.a[i][j];returnfalse;}booloperator==(constNode&b)const{for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)if(a[i][j]!=b.a[i][j])returnfalse;returntrue;//两数组相同}};Node st,ed;map<Node,bool>vis;intdir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};intbfs(){queue<Node>que;que.push(st);vis[st]=true;while(!que.empty()){Node u=que.front(),t=u;//t:临时变量que.pop();if(u==ed)//使用returnu.dis;for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)if(u.a[i][j]=='1')//(i,j)位置是玩具for(intk=0;k<4;++k){intx=i+dir[k][0],y=j+dir[k][1];//(x,y)移动的目标位置if(x>=1&&x<=4&&y>=1&&y<=4&&u.a[x][y]=='0'){swap(t.a[i][j],t.a[x][y]);if(!vis[t]){vis[t]=true;t.dis=u.dis+1;que.push(t);}swap(t.a[i][j],t.a[x][y]);//将t还原为和u相同}}}return-1;//如果无解返回-1,尽管题目没有要求}intmain(){for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)cin>>st.a[i][j];for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)cin>>ed.a[i][j];cout<<bfs();return0;}
解法2:双向广搜+使用string表示状态
#include<bits/stdc++.h>usingnamespacestd;structNode{chara[5][5];stringstr(){string s;for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)s.push_back(a[i][j]);returns;}};Node st,ed;map<string,int>vis,dis;intdir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};intbfs(){queue<Node>que;que.push(st);que.push(ed);vis[st.str()]=1,vis[ed.str()]=2;if(vis.size()==1)return0;//起点终点相同while(!que.empty()){Node u=que.front(),t=u;//t:临时变量que.pop();for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)if(u.a[i][j]=='1')//(i,j)位置是玩具for(intk=0;k<4;++k){intx=i+dir[k][0],y=j+dir[k][1];//(x,y)移动的目标位置if(x>=1&&x<=4&&y>=1&&y<=4&&u.a[x][y]=='0'){swap(t.a[i][j],t.a[x][y]);if(vis[t.str()]==0){vis[t.str()]=vis[u.str()];dis[t.str()]=dis[u.str()]+1;que.push(t);}elseif(vis[t.str()]!=vis[u.str()])//相遇returndis[t.str()]+dis[u.str()]+1;swap(t.a[i][j],t.a[x][y]);}}}}intmain(){for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)cin>>st.a[i][j];for(inti=1;i<=4;++i)for(intj=1;j<=4;++j)cin>>ed.a[i][j];cout<<bfs();return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/26 21:44:50

5-脱氧-L-阿拉伯糖—结构独特的稀有单糖,药物设计与合成化学的宝贵砌块 CAS:13039-56-0

5-脱氧-L-阿拉伯糖是一种天然存在但相对稀有的五碳脱氧单糖&#xff0c;其独特的L-构型与脱氧结构赋予其区别于常见D-型糖的化学与生物学特性。作为手性合成与药物化学中的高价值砌块&#xff0c;它正日益受到糖化学、抗感染药物研发及糖生物学研究领域的关注。化学信息化学名称…

作者头像 李华
网站建设 2026/1/31 16:59:16

2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖 —— 糖化学与药物研发的关键砌块 CAS:67561-97-1

2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖是糖化学与糖药物研究领域中一类重要的修饰单糖衍生物。作为5-硫代葡萄糖的结构前体与保护形式&#xff0c;它不仅是糖生物学基础研究的关键工具分子&#xff0c;更为开发新型糖基化抑制剂、糖模拟药物及诊断探针…

作者头像 李华
网站建设 2026/1/28 9:29:10

群体分析如何改变你的客户洞察

原文&#xff1a;towardsdatascience.com/how-cohort-analysis-can-transform-your-customer-insights-ff7e221b8fdc 尽管进行了数月的营销努力&#xff0c;但你的销售额仍在下降&#xff0c;客户参与度也在下降。出了什么问题&#xff1f;如果有一种方法可以精确地确定客户何时…

作者头像 李华
网站建设 2026/1/25 17:01:46

别再为BGM被下架了,可以生成带声音且无版权素材的AI,真的来了

我做自媒体这么多年&#xff0c;最怕的不是没灵感&#xff0c;而是“做完视频被版权一刀切”。BGM 要么平台判侵权&#xff0c;要么授权贵到离谱&#xff1b;环境音、拟音、人声配音更麻烦——自己录质量差&#xff0c;请配音师成本高、周期长。所以我一直在找一种东西&#xf…

作者头像 李华
网站建设 2026/1/27 12:38:41

vue和springboot框架开发的校园商店零售管理系统_pt87nuk3

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vuespringboot_pt87nuk3 框架开发的校园商店零售管理…

作者头像 李华
网站建设 2026/1/25 14:58:22

vue和springboot框架开发的校园智能AI问答技术的快递物流管理系统_5kf8to85

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vuespringbootAI_5kf8to85 问答技术的快递物流管理系…

作者头像 李华