首页 分享 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)

【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)

来源:萌宠菠菠乐园 时间:2025-01-09 23:35

最新推荐文章于 2024-01-10 10:23:25 发布

Go away 于 2020-07-12 19:18:23 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

【蓝桥杯】历届试题 青蛙跳杯子 问题描述思路分析代码实现

问题描述

题目链接:青蛙跳杯子 资源限制
时间限制:1.0s 内存限制:256.0MB 问题描述   X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
  X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
  如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。   
*WWWBBB
  其中,W字母表示白色青蛙,B表示黑色青蛙,表示空杯子。   X星的青蛙很有些癖好,它们只做3个动作之一:
  1. 跳到相邻的空杯子里。
  2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
  3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。   对于上图的局面,只要1步,就可跳成下图局面:   
WWWBBB   
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。   
输入为2行,2个串,表示初始局面和目标局面。
输出要求为一个整数,表示至少需要多少步的青蛙跳。

样例输入
WWBB
WWBB

样例输出
2

样例输入
WWWBBB
BBBWWW

样例输出
10

思路分析

思路代码参考:【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)
看到这道题的第一想法是想让青蛙去跳来实现,但这一思路无从下手。然后参考了上面这个,转换了思路:
我们不要以青蛙为主体去对字符串的空位进行位置交换,而是转而以空位(“*”)为主体,将题目转化为“有两个字符串“例如 *WWBB和WWBB,*每次能往左或右跳1-3步,与原位置的字符交换,问跳到第二个字符串的状态的最少步数”。

代码实现

#include <iostream> #include <queue> #include <cstring> #include <set> using namespace std; int dir[]={-3,-2,-1,1,2,3}; //可移动的6种方案 struct situation{ //定义结构体:形势string str; //当前形势下的字符串int step; //得到当前形势的步数situation(string s,int n)//构造函数{str=s,step=n;} }; queue <situation> q; set <string> s;//每一步得到的所有字符串 void bfs(string start,string target) {if(start==target){cout<<0<<endl;return;}q.push(situation(start,0));s.insert(start);while(!q.empty()){situation now=q.front();//每次将要进行处理的形势放入now中q.pop();string str=now.str;//str表示当前进行处理的字符串for(int i=0;i<str.length();i++){if(str[i]!='*')continue;//仅对空杯子的位置进行换位for(int j=0;j<6;j++)//对所有方案进行遍历{int n=i+dir[j];if(n>=0&&n<str.length())//如果当前换位合法{swap(str[i],str[n]);//交换青蛙和当前空杯子的位置if(str==target)//如果当前字符串等于目标字符串,则输出步数{cout<<now.step+1<<endl;return;}if(!s.count(str))//如果当前字符串还未出现过{s.insert(str);//将之前未出现过的字符串放入s集合中q.push(situation(str,now.step+1));}swap(str[i],str[n]);//恢复现场}}}} } int main() {string str1,str2;cin>>str1>>str2;bfs(str1,str2);return 0; }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

在这里插入图片描述

相关知识

【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)
蓝桥杯 历届试题 青蛙跳杯子(c++)
蓝桥杯2017年第八届真题
蓝桥杯
蓝桥杯真题:青蛙跳杯子
第十一届蓝桥杯青少组C++竞赛规则及样题.pdf.pdf
标题:青蛙跳杯子 [详解] X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 如下图,有一排杯子,左边的一个是空着的
关于第十六届蓝桥杯全国软件和信息技术专业人才大赛报名的通知
第十一届蓝桥杯(国赛)——玩具蛇
第十六届“蓝桥杯”全国软件和信息技术专业人才大赛(电子类)报名通知

网址: 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++) https://www.mcbbbk.com/newsview998166.html

所属分类:萌宠日常
上一篇: 宠物青蛙小时候吃什么 宠物青蛙的
下一篇: 宠物青蛙的饮食要求是什么,多久喂

推荐分享