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;
}
相关推荐
依然鸣4 天前
PTA团体程序设计天梯赛L2真题讲解L2-037-040
c++·经验分享·学习·算法·蓝桥杯·深度优先·pat考试
YuforiaCode4 天前
第十六届蓝桥杯 2025 C/C++组 数列差分
c语言·c++·蓝桥杯
QAQo7T4 天前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
普通网友4 天前
蓝桥杯 DP 优化:从 O (n²) 到 O (n) 的滚动数组实战
职场和发展·蓝桥杯
醉颜凉4 天前
蓝桥杯2025年第十六届省赛真题-好串的数目
职场和发展·蓝桥杯
醉颜凉4 天前
蓝桥杯2025年第十六届省赛真题-最大数字 Python题解
python·职场和发展·蓝桥杯
2301_806204464 天前
蓝桥杯第十四届省赛代码参考
职场和发展·蓝桥杯
Ronin-Lotus4 天前
蓝桥杯篇---EEPROM内部存储地址
职场和发展·蓝桥杯·c·eeprom·keil
计算机小白一个4 天前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
依然鸣7 天前
蓝桥杯多校模拟赛 题解
数据结构·c++·经验分享·学习·算法·蓝桥杯