问题描述
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,否则按无效代码处理。

当时比赛做这题时,青蛙跳杯子的方式,可以直接看作非星号字符和星号字符的交换,一共6种交换方式,问至少需要几步,可以想到用搜索的方式,且一定为一棵搜索树,明显就是广搜嘛,再看下数据量也很小,重点在于防止青蛙来回跳,局面不变的情况,所以只要做个简单的剪枝肯定能过。

ok下面给上比赛时写的代码

import java.util.*;class Main {static String a;//初始局面static String b;//目标局面static int cin;//保存星号的位置static String temp;//保存临时局面static int count;//树的深度表示搜索的次数static int num_1=1;//当前这一代节点的个数static int num_2=0;//保存下一代子节点的个数public static void main(String[] args) {Scanner sc=new Scanner (System.in);a=sc.next();b=sc.next();bfs();System.out.println(count+1);}static int findstar(String a) {//确定星号的位置,也就是空杯子的位置for(int i=0;i<a.length();i++) {if(a.charAt(i)=='*')return i;}return -1;}static String exchange(String a,int m,int n) {//交换两个字符的位置,也就是青蛙跳杯子char t [] =a.toCharArray();String tt="";char temp=t[m];t[m]=t[n];t[n]=temp;for(int i=0;i<t.length;i++) {tt=tt+t[i];}return tt;}static void bfs() {Queue<String> queue=new LinkedList<String>();//队列保存每一代子节点,也就是每次青蛙跳了一次后的局面TreeSet<String> ts=new TreeSet<>();//剪枝,防止青蛙来回跳相同的局面while(true) {if(queue.isEmpty()) {queue.add(a);ts.add(a);}if(num_1==0) {//每一代的节点为0时,num1重新赋值为num2,num2重置num_1=num_2;num_2=0;count++;}String re=queue.poll();cin=findstar(re);if(cin-1>=0) {temp=exchange(re, cin, cin-1);if(temp.equals(b)) {//找到了直接退出即可break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}if(cin-2>=0) {temp=exchange(re, cin, cin-2);if(temp.equals(b)) {break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}if(cin-3>=0) {temp=exchange(re, cin, cin-3);if(temp.equals(b)) {break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}if(cin+1<a.length()) {temp=exchange(re, cin, cin+1);if(temp.equals(b)) {break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}if(cin+2<a.length()) {temp=exchange(re, cin, cin+2);if(temp.equals(b)) {break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}if(cin+3<a.length()) {temp=exchange(re, cin, cin+3);if(temp.equals(b)) {break;}if(!ts.contains(temp)) {queue.add(temp);ts.add(temp);num_2++;}}num_1--;}}
}

蓝桥杯真题之青蛙跳杯子相关推荐

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

    [蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...

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

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

  3. 蓝桥杯——九宫重排、青蛙跳杯子

    1.历届试题 九宫重排   时间限制:1.0s   内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中 ...

  4. 2017蓝桥杯省赛---java---C---9(青蛙跳杯子)

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

  5. 第八届蓝桥杯真题解析javaC组

    第八届蓝桥杯真题解析javaC组 文章目录 ***第八届蓝桥杯真题解析javaC组*** 前言 A.外星日历 B.兴趣小组 C.纸牌三角形 D.承压计算 E.杨辉三角 F.最大公共子串 G.Excel ...

  6. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  7. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  8. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  9. 【蓝桥杯真题】16天冲刺 Python

    距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和  ...

最新文章

  1. 2021年大数据Spark(十九):Spark Core的​​​​​​​共享变量
  2. HDFS_API基本应用
  3. java架构师,必须掌握的几点技术?
  4. Java_异常_03_ java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
  5. python数学表达式_Python入门笔记——(1)数字与表达式
  6. call 存储过程时必须声明表示符_图解面试题:SQL存储过程有什么用?
  7. 如何使用新浪微博相册作为markdown的图床
  8. SAP UI5 component.js createContent
  9. php 电梯程序设计,教你写出京东电梯式轮播
  10. 重磅! SpringBoot+Sentinel+Nacos已撸完
  11. 进程串行变并行linux,linux进程简述
  12. 容易忘记的linux命令之rpm
  13. Android使用Zxing库生成PDF417扫描后多一个字符A
  14. dcs world f15c教学_你使用的DCS系统靠谱吗?!
  15. 自己动手恢复硬盘丢失数据
  16. ALU计算机专业术语,计算机专业术语大全
  17. 如何在3dmax中断开当前选中的链接
  18. 微信小程序开发(三)入门之创建打卡活动
  19. 阿里巴巴Java开发手册免费下载
  20. Cornerstone的分支问题Merge dry run failed: working copy is too old

热门文章

  1. 1000道阿里巴巴初级~高级Java工程师面试题(含答案,软件架构师之路阅读
  2. BZOJ4631 踩气球
  3. 有101根电线 每根的一头在楼底 另一端在楼顶 有一个灯泡 一个电池 无数根很短的电线 怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。
  4. 【转】window7下Word 2007报“Microsoft office word已停止工作“
  5. php如何获取当前日期时间函数,php如何使用date()函数获取当前时间
  6. 金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)
  7. MySQL学习之路(八):MySQL创建数据表
  8. DVWA——改GBK尝试宽字节注入(brute教程)
  9. MYSQL Function函数创建和调用
  10. 电脑系统时间变慢的原因,原来是这个没启动