有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。
我们把这些蚱蜢顺时针编号为 1~8,每只蚱蜢都可以跳到相邻的空盘中,
也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?
注意:要求提交的是一个整数,请不要填写任何多余内容或说明文字。
思路分析:从一个状态到另一个状态最少需要多少步骤,毫无疑问就是BFS问题。此题与人工智能中的经典问题–八数码问题差不多类似。先将字符串012345678入队列,然后出队列,按照规则产生新的字符串,如果该字符串就是目标字符串那么就终止,如果不是且以前没有出现过,那么就入队列,重复上述操作即可。
从分析来看,我们需要解决以下几个问题:
怎么判重?这个其实很简单,C++判重一般就考虑set就可以了,将每一种新产生字符串放入set就可以达到目标。
怎么产生新的字符串?
我们再仔细观察这张图:我们将空盘记为0,第一轮开始,1和8都可以跳到0位置,另外7和2也可以跳到空盘里。因此每一轮都可以产生四个新的状态。我们可以定义一个数组包含1,2,-1,-2四个数来表示四个方位,用当前位置+9再对9取模即是要跟空盘交换的位置。
怎么记录这些状态?空盘位置在变,而我们每一次跳跃都是以空盘为基础的,所以空盘的位置在每个状态必须被记录下来;另外字符串长啥样也要记录下来,此外还有跳跃的次数也要记录下来。因此我们可以定义一个结构体,里面包含pos和s以及cnt三个变量。
代码:
#include
using namespace std;
struct state {
int pos,cnt; //pos记录当前空盘位置,cnt记数,表示走了几步
char *s; //当前字符串
state(int pos,char *s,int cnt):pos(pos),s(s),cnt(cnt){} //构造函数
};
struct cmp {
bool operator()(char *a,char *b) {
return strcmp(a,b)>0;
}
};
int change[4]={-1,-2,1,2},cnt=1; //change表示四个位置,左1左2,右1右2
char *start=“012345678”,*end=“087654321”;
queue q;
set
void swap(char *s,int a,int b) {
char t=s[a];
s[a]=s[b];
s[b]=t;
}
int bfs() {
q.push(state(0,start,0)); //初始状态入队
while(!q.empty()) {
state temp=q.front(); //获取当前队头结点
int pos=temp.pos;
int cnt=temp.cnt;
char s=temp.s;
check.insert(s);
if(strcmp(s,end)==0) { //已经找到就结束
cout<
}
q.pop();
//产生新字符串入队
for(int i=0;i<4;i++) {
char t=(char)malloc(9
strcpy(t,s);
int newpos=(pos+change[i]+9)%9; //交换后新的空盘位置
swap(t,pos,newpos); //交换
if(check.find(t)==check.end()) {
check.insert(t);
q.push(state(newpos,t,cnt+1)); //新结点入队
}
}
}
}
int main() {
bfs();
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
答案:20
点赞
4
评论
分享
收藏
1
手机看
关注
wayway0554的博客
1307
2017年第八届蓝桥杯C/C++A组第二题—跳蚱蜢
跳蚱蜢 有9只盘子,排成1个圆圈。 其中8只盘子内装着8只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。 请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列, 并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃? 注意:要求提交的是一个整数,请不要填写任…
Willen_的博客
303
蓝桥杯2017c++A组真题&代码第二题跳蚱蜢
蓝桥杯2017c++A组真题&代码第二题跳蚱蜢/*标题:跳蚱蜢如图 p4-1.png 所示:有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变…
Z0uY&z#1的博客
278
2017第八届蓝桥杯C/C++ A组题解
第一题标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把10…
weixin_42295018的博客
166
蓝桥杯—第八届—A组—第二题—跳蚱蜢 {C语言}=====【可调试】
如图 p1.png 所示:有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?注意:要求提交的是一个…
2017年第八届蓝桥杯【省赛C/C++ A组】做题记录(附详细…_CSDN博客
7-21
2017年蓝桥杯第八届【省赛C/C++ A组】做题记录,保持手感,专注备赛。… Loading [MathJax]/jax/output/HTML-CSS/jax.js
2017年第八届蓝桥杯C/C++A组第二题—跳蚱蜢 - wayway0554的博客
12-13
2016年蓝桥杯省赛A组C/C++ 第二题 跳蚱蜢(BFS搜索+状态压缩) 阅读数 3478 题目描述: 标题:跳蚱蜢 如图 p1.png 所示: 有9只盘子,排成1个圆圈。 其中8…
Alex
90
征战蓝桥 —— 2017年第八届 —— C/C++A组第2题——跳蚱蜢
题目如图所示:有9只盘子,排成1个圆圈。其中8只盘子内装着8只蚱蜢,有一个是空盘。我们把这些蚱蜢顺时针编号为 1~8每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?注意:要求提交的是一个整数,请不要填写任何多余内…
Cyril_KI的博客
65
2017年第八届蓝桥杯【省赛C/C++ A组】做题记录(附详细思路)
2017年蓝桥杯第八届【省赛C/C++ A组】做题记录,保持手感,专注备赛。
(2017)第八届蓝桥杯大赛个人赛省赛(软件类) C/C++ 大学…_CSDN博客
10-16
我觉得我省赛的水平还是没问题的,第六届第七届我都是吉林省第二名,当然省赛的题目本身对算法的考察度不高。。。很暴力的那种= = 这篇题解针对的是对算法了…
跳蚱蜢_C/C++_zhuibushixi的博客-CSDN博客
3-23
09-20浏览器打开第八届蓝桥杯省赛c++a组 跳蚱蜢 ryo_218 1031次阅读 03-30浏览器打开 2017年第八届蓝桥杯c/c++a组第二题—跳蚱蜢 wayway0554 1101次…
Apare_xzc的博客
158
[蓝桥杯解题报告]第八届蓝桥杯大赛省赛2017(软件类)真题C++A组 Apare_xzc
蓝桥杯第八届(2017年)省赛软件类C++A组解题报告Apare_xzc 2020/3/16 1. 迷宫(5分)分析: 按照题意,模拟每个人的路线即可。如果绕圈子,一定出不去。如果走到了之前到过的地方,一定在绕圈子,我们可以开一个标记数组vis[10][10]记录莫个人是否走过该点。…
weixin_33696822的博客
66
第八届蓝桥杯省赛真题题解
2017年蓝桥杯试题解析不得不说自己还是太菜了,2017年蓝桥杯填空题自己就措手不及了。。t1标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思…
第八届蓝桥杯省赛C++A组 跳蚱蜢_ryo_218的博客-CSDN博客
12-28
其中8只盘子内装着8只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空盘…
2017第八届蓝桥杯省赛-大学A组 跳蚱蜢(广搜BFS+状态压…_CSDN博客
10-28
其中8只盘子内装着8只蚱蜢,有一个是空盘。 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中, 也可以再用点力,越过一个相邻的蚱蜢跳到空…
ryo_218的博客
2万+
蓝桥杯省赛C++A组B组题解整理(第十、九、八、七、六、五、四、三届)
【写在前面的话19.03.24】从第八届蓝桥杯到第十届蓝桥杯,我也是参加了三届蓝桥杯的老学姐啦,更不更新第十届的题解取决于网上有没有流出题目,但是第十届之后的题解将不会再更新了。下面的这些真题大多是我在大一的时候刷的,在大二的时候整理的,在大三的时候有修正或加更。大一的时候还不太会写代码,大约是2月份开始学编程,刷真题,4月初比的赛,然后拿了省一进了国赛,最后也混了一个国三。总有小伙伴问我大概…
萌新的博客
713
蓝桥杯省赛 C/C++ ABC组题解(第四届 ~ 第十一届)持续更新
第十届蓝桥杯题号C++ A组C++ B组C++ C组试题A平方和组队求和试题B数列求值年号字串矩形切割试题C最大降雨量数列求值年号字串试题D迷宫数的分解质数试题ERSA解密迷宫最大降雨量试题F完全二叉树的权值特别数的和旋转试题G外卖店优先级完全二叉树的权值外卖店优先级试题H…
2017第八届蓝桥杯大赛软件类省赛 C/C++ 大学 A 组_qq_4…_CSDN博客
3-25
第八届蓝桥杯大赛个人赛省赛(软件类)C/C++ 大学A组考生须知:l 考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试题。l 考试时间为4小时。时间截…
2017第八届蓝桥杯C/C++ A组题解_Z0uY&z#1的博客-CSDN博客
1-1
第二题标题:跳蚱蜢如图p1.png 所示: 有9只盘子…2017第八届蓝桥杯C/C++语言A组 阅读数 131 题目…2017年蓝桥杯省赛javaA组 阅读数 207 1.标题:迷
————————————————
版权声明:本文为CSDN博主「Cyril_KI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Cyril_KI/article/details/107481381