蓝桥杯 跳蚱蜢【BFS】

编程入门 行业动态 更新时间:2024-10-08 18:41:10

蓝桥杯 跳<a href=https://www.elefans.com/category/jswz/34/1760569.html style=蚱蜢【BFS】"/>

蓝桥杯 跳蚱蜢【BFS】

1.题目大意
9个盘子摆成一个环,盘里装着蚱蜢,左四个,右四个,对称轴上有一个空盘,蚱蜢只能跳到相邻的或隔着一个盘子的空盘;开始时顺时针编号(左四个1234,右四个5678)问最少经过多少次跳跃能让盘子编号变为逆时针顺序且开始时的空盘位置不变(左四个8765,右四个4321)

2.解决方法
把当前盘子的状态以字符串形式记录,空盘编号设为0,开始时的状态为123456780,结束状态为876543210。0可以向左或向右移动1,2个单位,从起点BFS直到找到终点;

但是为了复习双向广搜,本题用牛刀杀鸡了,,,,

3.代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>using namespace std;map<string,int> m1;
map<string,int> m2;
int cnt;
string start="123456780";
string ed="876543210";bool extend(queue<string> &q,map<string,int> &m1,map<string,int> &m2)
{string t=q.front();q.pop();string mid=t;int loc;for(int i=0;i<(int)t.size();i++)if(t[i]=='0'){loc=i;break;}for(int i=0;i<4;i++){if(i==0){swap(mid[(loc-2+9)%9],mid[loc]);}else if(i==1){swap(mid[(loc-1+9)%9],mid[loc]);}else if(i==2){swap(mid[(loc+1+9)%9],mid[loc]);}elseswap(mid[(loc+2+9)%9],mid[loc]);if(m2.count(mid)){cout<<m1[t]+1+m2[mid]<<endl;return true;}if(!m1.count(mid)){q.push(mid);m1[mid]=m1[t]+1;}mid=t;}return false;
}void bfs()
{queue<string> q1;queue<string> q2;q1.push(start);q2.push(ed);m1[start]=0;m2[ed]=0;while(!q1.empty()&&!q2.empty()){bool t;if(q1.size()<=q2.size())t=extend(q1,m1,m2);elset=extend(q2,m2,m1);if(t) break;}
}int main(void)
{bfs();return 0;
}

更多推荐

蓝桥杯 跳蚱蜢【BFS】

本文发布于:2024-02-13 20:55:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760227.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:蚱蜢   蓝桥杯   BFS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!