资源限制

时间限制:1.0s   内存限制:256.0MB

  X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
  X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
  如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。

  *WWWBBB

  其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。

  X星的青蛙很有些癖好,它们只做3个动作之一:
  1. 跳到相邻的空杯子里。
  2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
  3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。

  对于上图的局面,只要1步,就可跳成下图局面:

  WWW*BBB

  本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。

  输入为2行,2个串,表示初始局面和目标局面。
  输出要求为一个整数,表示至少需要多少步的青蛙跳。

  例如:

输入格式

  *WWBB
  WWBB*

  则程序应该输出:
  2

  再例如,

输入格式

  WWW*BBB
  BBB*WWW

  则程序应该输出:
  10

  我们约定,输入的串的长度不超过15

  资源约定:
  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms

  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

  所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
  不要使用package语句。不要使用jdk1.7及以上版本的特性。
  主类的名字必须是:Main,否则按无效代码处理。

  ----------------------------

  笨笨有话说:
  我梦见自己是一棵大树,
  青蛙跳跃,
  我就发出新的枝条,
  春风拂动那第 5 层的新枝,
  哦,我已是枝繁叶茂。

简介

当每一次操作的权值都是1时,像此类的最少操作,最短路等问题,显然BFS是一个不错的选择。每个状态的出现都能保证是通过最少的步骤第一次出现。需要利用队列,并且用结构体来构建状态。此题的状态主要是字符序列,当前位置,当前操作步数。

struct node {//利用结构体来表示状态int x, step;  //记录当前位置,和步数string sn;//当前字符串序列
};

为了避免可能存在的重复序列,利用map来实现判断每个字符序列是否出现过。

map<string, int>mp;  //判断该状态的字符串是否出现过,避免重复搜索

int是此字符串序列对应的值,1代表出现过,0代表没出现过。

了解map戳这里。

创建队列后,初始状态入队,即先找到第一个空杯子的位置,只有结合空杯子才能进行跳跃。

 queue<node>q;now.sn = s1; now.step = 0;//初始状态now.x = sx; mp[s1] = 1;//初始位置是第一个杯子的位置,标记初始字符序列,代表出现过

通过题干可知青蛙能做三种运动,因为动作无向,每种动作可前可后。所以应该是有6种跳法。青蛙能这么对着空杯子跳,所以也可以认为这空杯子能这样跳。不过在搜索过程中,不用判断跳的位置是否能跳。因为开始搜索的位置是空杯子,每次空杯子跳后,和对应位置交换,跳过去的位置成了空杯子。每次入队的位置都是空杯子的位置。而空杯子是一定能跳的,就算跳的位置也是空杯子,那便是相当于没跳,没跳的状态出现过,所以不会搜索。所以不用判断跳的位置是什么。

Code

#include <bits/stdc++.h>
using namespace std;
string s1, s2;
int minn, sx;//记录最小值和第一个空杯子
int dx[6] = { 1,2,3,-1,-2,-3 };//青蛙能做的三种动作,其实也相当于空杯子能这样。
map<string, int>mp;  //判断该状态的字符串是否出现过,避免重复搜索
struct node {//利用结构体来表示状态int x, step;  //记录当前位置,和步数string sn;//当前字符串序列
};
node now, t;//now为当前的状态,t为临时状态
void bfs() {queue<node>q;now.sn = s1; now.step = 0;//初始状态now.x = sx; mp[s1] = 1;//初始位置是第一个杯子的位置q.push(now);//入队while (!q.empty()) {now = q.front();//取出队首q.pop();//出队for (int i = 0; i < 6; i++) {//搜6个跳法string s = now.sn;//s存储当前字符序列int xx = now.x + dx[i];//xx记录跳的位置if (xx >= 0 && xx < s1.length()) {//未越界swap(s[now.x], s[xx]);//交换if (mp[s] == 1)  continue;   //这种情况搜过,就跳过mp[s] = 1;//标记t.x = xx; t.step = now.step + 1;//记录新状态t.sn = s;if (t.sn == s2) {//如果达到了目标状态就结束搜索minn = t.step;//因为每次状态一定是第一次出现,步数数最少的,所以直接返回return;}//否则新状态入队继续搜索q.push(t);}}}
}
int main() {cin >> s1 >> s2;for (int i = 0; i < s1.size(); i++) if (s1[i] == '*') {sx = i; break;}bfs();printf("%d", minn);return 0;
}

蓝桥杯 青蛙跳杯子【第八届】【省赛】【C组】 BFS 广搜相关推荐

  1. Java实现第八届蓝桥杯青蛙跳杯子

    青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色.X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去.如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有 ...

  2. 蓝桥杯 青蛙跳杯子

    问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  3. 蓝桥杯 青蛙跳杯子(广搜)

    问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  4. 【2023蓝桥杯】2017年第八届C/C++A组真题(解析笔记)

    目录 T1:迷宫 - 暴力dfs+标注  T2:跳蚱蜢 - 9数算式 全排列 + 枚举乘号位置 T3:魔方状态 - 模拟 + 判重 (高手入*****) T4:方格分割 - dfs + 从中心点去切割 ...

  5. 2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析

    水平有限,如有不当请不吝赐教,万分感谢 水下探测器 水下探测器可以潜入湖中在任意水深进行科学探索. 湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<=100: 探测器最初的水 ...

  6. python【蓝桥杯vip练习题库】ADV-147学霸的迷宫(广搜 bfs经典问题)

    试题 算法提高 学霸的迷宫 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里, ...

  7. 训练赛一:bfs广搜题目 CF115B Lawnmower

    CF115B Lawnmower time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. 第八届蓝桥杯省赛——青蛙跳杯子

    第八届蓝桥杯省赛--青蛙跳杯子 题目描述 XXX 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. XXX 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的 ...

  9. 蓝桥杯练习:青蛙跳杯子

    青蛙跳杯子 原题链接:问题 1878: [蓝桥杯][2017年第八届真题]青蛙跳杯子 解题思路:将问题简单转化为青蛙和*的换位,使用BFS搜索即可,为避免重复状态使用map存储,可以在O(1)判重 i ...

最新文章

  1. IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
  2. 社会生活中常用的14条著名法则
  3. 公众号知道我浏览他吗_微信公众平台文章能看到访客吗?
  4. python global 变量_python 全局变量和局部变量 (例子)
  5. POJ - 3635 Full Tank?(bfs)
  6. 【图像处理】——Python实现two_pass方法来进行连通域的提取
  7. 微软OOXML正式成为国际标准 更名为OXML
  8. iOS 手记 - 计算文字高度/宽度:- (CGSize)sizeWithAttributes:(NSDictionaryNSString *,id *)attrs...
  9. [原]批量生成AWR报告
  10. Centos学习笔记 linux 常用命令:压缩解压命令
  11. HOWTO For iSCSI-SCST Gentoo HOWTO For iSCSI-SCST
  12. anaconda moviepy_Anaconda使用之安装篇(Windows)
  13. html 文字 转 语音,把文字变成语音的软件
  14. photoshop 证件照动作_国考报名确认及缴费进行中!证件照上传注意事项!
  15. chainlink2022年春季编程马拉松
  16. C++ 自定义函数(全)
  17. Dialog_xml制作——博客地址
  18. 任何情况下请通过正规渠道变更信用卡额度
  19. fflush函数实例
  20. 在linux系统上怎么架设服务器吗,Linux下各种服务器的架设详解

热门文章

  1. 笔记本电脑静音键(F1)一直亮且无法播放声音的解决办法
  2. CDH5.15.0+spark1.6.0+hive1.1集群与zeppelin0.8.1+spark-notebook打通踩坑总结
  3. Arista EOS log level
  4. 模拟丢包、慢网速的测试工具
  5. 8、spss做因子分析及主成分分析
  6. 10/9 看的何向南老师团队关于bias和debias最新综述;还可以吧
  7. luogu1830 轰炸III
  8. 解决禅道升级报错:Column not found: 1054 Unknown column 'readme' in 'zt_im_client'
  9. K8S常见故障及解决方法
  10. python爬虫实现股票数据存储_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储!...