题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示: 有 99 只盘子,排成 11 个圆圈。 其中 88 只盘子内装着 88 只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 11 ~ 88。
每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列, 并且保持空盘的位置不变(也就是 1-81−8 换位,2-72−7换位,...),至少要经过多少次跳跃?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
#include<iostream>
#include<queue>
#include<unordered_map>
using namespace std;
#define itn int
queue<int> q;
int m=9;//有九个盘子
string start="012345678";//起始
string en="087654321";//终止
unordered_map<string,itn>dist;
itn dx[4]={-1,1,-2,2};
//方向左1,右1,左1,左2
itn ans;
int bfs()
{
dist[start]=0;//dist表示到[]序列的步数
queue<string>q;
q.push(start);//将开始的值入队
while(q.size())
{
string t=q.front();
q.pop();
int flag=t.find('0');
for(itn i=0;i<4;i++)
{
string str =t;
swap(str[flag],str[(flag+dx[i]+m)%m]);//交换空盘和当前选中的盘子
if(dist.count(str))
continue;//如果该序列选过,则重开
dist[str]=dist[t]+1;//将调整后序列+1
if(str==en)//如果得到目标序列,退出
return dist[str];
q.push(str);//压入得到的序列
}
}
return 0;
}
itn main()
{
cout<< bfs()<<endl;
return 0;
}