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

题目描述

XXX 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。

XXX 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。

如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。

∗WWWBBB*WWWBBB∗WWWBBB
其中,WWW 字母表示白色青蛙,BBB 表示黑色青蛙,∗∗∗ 表示空杯子。

XXX 星的青蛙很有些癖好,它们只做 3 个动作之一:

跳到相邻的空杯子里。

隔着 1 只其它的青蛙(随便什么颜色)跳到空杯子里。

隔着 2 只其它的青蛙(随便什么颜色)跳到空杯子里。

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

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

输入格式

输入为 2 行,2 个串,表示初始局面和目标局面。我们约定,输入的串的长度不超过 15。

输出格式

输出要求为一个整数,表示至少需要多少步的青蛙跳。

输入样例:

*WWBB
WWBB*

输出样例:

2

运行限制

最大运行时间:1s
最大运行内存: 256M

题目大意

其实就是将空杯子在6个方向上跳,左三,左二,左一,右一,右二,右三,使之将开始状态转变为终止状态。
下图是模拟的样例:

题目解决思路

  1. 先将两种状态读入进来,startend,并记录一下初始状态的长度len
 cin >> start;cin >> endd;len = start.length();
  1. 这道题目是道典型的求最短路径的题目,采用bfs的做法,直接枚举6个向量,不越界的且该状态未被更新的则更新该状态的距离,入队列,如果队头状态等于终止状态,则停止搜索返回距离,结束bfs算法。
int bfs()
{unordered_map<string, int> d;q.push(start);d[start] = 0;int dx[6] = {-3, -2, -1, 1, 2, 3};while (q.size()){string t = q.front();q.pop();int distance = d[t];if(t == endd) return distance;int k =  t.find('*');for (int i = 0; i < 6; i ++ ){int a = k + dx[i];if(a >= 0 && a < len){swap(t[a], t[k]);if(!d.count(t)){d[t] = distance + 1;q.push(t);}swap(t[a], t[k]);}}}return -1;
}

代码如下~

c++代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <queue>using namespace std;string start, endd;
queue<string> q;//存储状态
int len;//状态的长度int bfs()
{unordered_map<string, int> d;//存储该状态下的坐标q.push(start);//将初始状态入队列d[start] = 0;//初始状态距离为0int dx[6] = {-3, -2, -1, 1, 2, 3};//6个向量左三、左二、左一、右一、右二、右三while (q.size())//当队列为空时结束bfs算法{string t = q.front();//出队列,命名为状态tq.pop();int distance = d[t];//取出t状态的距离distanceif(t == endd) return distance;//如果t状态和终止状态相等,退出bfs,返回distanceint k =  t.find('*');//找出空杯所在的位置for (int i = 0; i < 6; i ++ )//枚举6个向量{int a = k + dx[i];//加上偏移量后点的坐标if(a >= 0 && a < len)//如果没有越界{swap(t[a], t[k]);//交换位置,获取新的状态if(!d.count(t))//如果该状态未被遍历则更新该状态的距离,入队列{d[t] = distance + 1;q.push(t);}swap(t[a], t[k]);//还原现场,因为还有剩余的向量并没有被枚举过}}}return -1;//如果没有找到的话,返回-1
}int main()
{cin.tie(0);//cin加速器cin >> start;//读入开始状态cin >> endd;//读入终止状态len = start.length();//获取状态的长度cout << bfs();//输出答案return 0;
}

第八届蓝桥杯省赛——青蛙跳杯子相关推荐

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

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

  2. 蓝桥杯真题——青蛙跳杯子

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

  3. 2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - C. 魔方状态

    2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - C. 魔方状态 魔方状态 二阶魔方就是只有2层的魔方,只由8个小块组成. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色, ...

  4. 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...

  5. 2017第八届蓝桥杯省赛JAVA C组真题解析(带源码及解析)

    蓝桥杯历年真题及解析. 目录: 蓝桥杯历年真题及解析. A:外星日历(难度:★) 题目: 分析: 代码: B:兴趣小组(难度:★) 题目: 分析: 代码: C:纸牌三角形(难度:★★★) 题目: 分析 ...

  6. 第八届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)

    目录 A.外星日历 B.兴趣小组 C.纸牌三角形 D.承压计算 E.杨辉三角(填空) F.最大公共子串 G.Excle地址 H.拉马车 I.青蛙跳杯子 J.图形排版 A.外星日历 某星系深处发现了文明 ...

  7. 2017年第八届蓝桥杯省赛题目python解答(更新中)

    目录 1. 迷宫 2. 跳蚱蜢 3. 魔方状态 4. 方格分割 5. 正则表达式 6. 包子凑数 ·· 1. 迷宫 思路:使用暴力的方法来求解,对于每一个玩家,计算他能否走出去.对于一些走不出去的玩家 ...

  8. 2017年第八届蓝桥杯省赛B组 C/C++

    2017.4.8,第八届蓝桥杯初赛,时隔一月多,才写个题解,贼尴尬...这学期竞赛多,PAT,天梯赛初决赛,蓝桥杯初决赛,ACM省赛,加上课程也多,真是累成狗了,蓝桥初赛后就一直学习课程,和小伙伴一起 ...

  9. 填词游戏java_第八届蓝桥杯国赛 Java B组 第五题 填字母游戏(博弈论)

    解题思路: 因为是博弈论,所以我们要对先手的必胜态和必败态分析. 1.首先我们看赢遇到的状态,就是给出的串的子串有LO*,*OL,L*L这三种情况(就叫福利局吧~).都可以直接填出LOL,获胜. 2. ...

最新文章

  1. ehcache + mysql例子与性能测试
  2. Natasha 4.0 探索之路系列(二) 「域」与插件
  3. django models索引_sql – 为什么Django显式地在唯一字段上创建索引
  4. gocd_如何将DangerJS集成到GoCD管道中
  5. matlab中 s 函数简记
  6. Java迭代器的一般用法
  7. (28)FPGA计数器设计(软核实现)
  8. 服务器没有进行新建或修改数据的操作,14-认识DjangoRESTframework
  9. mysql innodb缓冲池_InnoDB 缓冲池
  10. mapreduce task与spark task对比
  11. 计算机国际期刊等级,计算机期刊等级(全)
  12. GDPR 和个人信息保护的小知识
  13. 《愤怒的小鸟》全系列游戏——这些都玩过,你就碉堡了~(版本一)
  14. 杨浦区服务器维修,上海杨浦区dns服务器地址
  15. 设计模式六大原则——单一职责原则(SRP)
  16. 康得新董事长是谁?_您人生董事会中的谁?
  17. html 星空效果,HTML5JSstar_动态星空效果
  18. 最强免费虚拟机:VirtualBox 4.3.12下载
  19. CSS实现文字垂直居中
  20. Unity Android平台接入支付宝SDK

热门文章

  1. 只想发泄一下!!很气愤!!也许是很气愤!!!!!
  2. grid网格布局。逆战班
  3. 孩子读书没兴趣怎么办?什么方法可以改善?
  4. Python缩进规则 (包含快捷键)
  5. java脏字过滤方法
  6. 怎么用计算机计算not,计算机如何进行逻辑计算—(计算机基础课十四)
  7. dnf剑魂buff等级上限_dnf7号除了免费苍穹武器,这副本改版后增加超强buff!
  8. concat()函数
  9. 【软件】一个简单文件批量重命名工具,支持正则替换
  10. 云服务器带宽原因,造成服务器带宽不足的原因解析