hh蓝桥杯一题--青蛙跳杯子

7.青蛙跳杯子 - 蓝桥云课

这个题目最后是抽象为bfs算法去解决的,一开始我怎么都没想到为什么会用bfs,后来看到他们的讲解才明白可以用bfs解决

任何可以用 BFS 解决的问题,都需要有以下几个要素:

  1. 状态(State):问题的某个特定情况

  2. 初始状态(Start State):问题的起始点

  3. 目标状态(Goal State):想要达到的终点

  4. 状态转移(State Transition):从一个状态到另一个状态的操作

  5. 状态空间(State Space):所有可能状态的集合

青蛙跳杯子问题

↓ 抽象

"状态" = 杯子排列

"移动" = 合法交换

↓ 转化

图论问题:找从起点到终点的最短路径

↓ 实现

BFS:队列 + 状态记录 + 合法性检查

接下来就是代码实现了(典型的bfs模板)

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;

string s1,s2;
int n;
int d[6]={-3,-2,-1,1,2,3};//6个可能跳跃的方向 
map<string,int> ans;//记录每个状态需要的步数 

int bfs()
{
	queue<string> q;
	q.push(s1);
	ans[s1]=0;//初始状态步数为0 
	
	while(q.size())
	{
		string s=q.front();
		q.pop();
		
		int cnt=ans[s];//当前步数 
		
		int x=s.find('*');//找到空位置 
		
		for(int i=0;i<6;i++)
		{
			int z=x+d[i];//目标青蛙的位置 
			if(z>=0&&z<n)
			{
				swap(s[x],s[z]);//交换空杯与青蛙
				//新状态没有被访问过 
				if(!ans.count(s))
				{
					ans[s]=cnt+1;//记录步数 
					if(s==s2)return ans[s];
					q.push(s);
				}
				swap(s[x],s[z]);
			}
		}
		
	}
	return -1;
}
int main()
{
	cin>>s1>>s2;
	n=s1.length();
	cout<<bfs();
	return 0;
}
相关推荐
一轮弯弯的明月1 天前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
hnjzsyjyj1 天前
洛谷 P8749:[蓝桥杯 2021 省 B] 杨辉三角形 ← 组合数 + 二分
蓝桥杯·二分·杨辉三角·组合数
Lauren_Blueblue1 天前
第十六届蓝桥杯省赛Python研究生组-F串
python·算法·蓝桥杯·算法基础
仟濹1 天前
【算法打卡day39(2026-04-06~08 周一~周三)】(10道蓝桥杯真题)今日练习:蓝桥杯第13届省赛B组Cpp组
算法·职场和发展·蓝桥杯
小年糕是糕手1 天前
【35天从0开始备战蓝桥杯 -- Day9】
数据结构·数据库·c++·算法·蓝桥杯
List<String> error_P2 天前
蓝桥杯最后几天冲刺
蓝桥杯
Tanecious.2 天前
蓝桥杯备赛:Day8-小苯的异或和
c++·蓝桥杯
Lauren_Blueblue2 天前
第十六届蓝桥杯省赛Python研究生组-C变换数组
python·算法·蓝桥杯·编程基础
Tanecious.2 天前
蓝桥杯备赛:Day8-小红杀怪
c++·蓝桥杯