跳蚱蜢(蓝桥杯 )

编程入门 行业动态 更新时间:2024-10-07 10:14:25

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

跳蚱蜢(蓝桥杯 )

跳蚱蜢

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下图所示: 有 9 只盘子,排成 1 个圆圈。 其中 8 只盘子内装着 8 只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1 ~ 8。


每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。
请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列, 并且保持空盘的位置不变(也就是 1-8 换位,2-7换位,…),至少要经过多少次跳跃?

运行限制
最大运行时间:1s
最大运行内存: 128M

算法分析

用数字来存取状态,以9来代表空盘子的位置,其他照常,初始状态为123456789,最终状态为876543219.用一个数组来存储状态,bfs,队列存储pair<int,int>前面代表状态,后面代表当前步数,
交换位置,我们就交换盘子数组,用到状态的话直接转化数字,存入队列当中

代码实现

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
queue<PII> q;
const int maxn=990000000;
int st=123456789,ed=876543219;
int plate[9];
int dir[4]={-2,-1,1,2};
bool vis[maxn];
int getnum()
{int x=0;for(int i=0;i<9;i++){x=x*10+plate[i];}return x;
}
void bfs()
{q.push(make_pair(st,0));memset(vis,0,sizeof(vis));vis[st]=1;while(q.size()){PII p=q.front();int val=p.first;int step=p.second;q.pop();int jiu;for(int i=8;i>=0;i--){if(val%10==9)jiu=i;plate[i]=val%10;val/=10;}for(int i=0;i<4;i++){swap(plate[jiu],plate[(jiu+dir[i]+9)%9]);int num=getnum();if(!vis[num]){vis[num]=1;if(num==ed){cout<<step+1<<endl;return ;}q.push(make_pair(num,step+1));}swap(plate[jiu],plate[(jiu+dir[i]+9)%9]);}}return ;
}
int main()
{bfs();return 0;
}

最后答案20

更多推荐

跳蚱蜢(蓝桥杯 )

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

发布评论

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

>www.elefans.com

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