蓝桥杯——跳蚱蜢——BFS搜索

202 阅读1分钟

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下图所示: 有 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;

}