蓝桥杯真题之青蛙跳杯子
X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。
X星的青蛙很有些癖好,它们只做3个动作之一:
1. 跳到相邻的空杯子里。
2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要1步,就可跳成下图局面:
WWW*BBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。
输入为2行,2个串,表示初始局面和目标局面。
输出要求为一个整数,表示至少需要多少步的青蛙跳。
WWBB*
BBB*WWW
资源约定:
峰值内存消耗(含虚拟机) < 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--;}}
}
蓝桥杯真题之青蛙跳杯子相关推荐
- 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)
[蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...
- 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)
历届试题 青蛙跳杯子 问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯 ...
- 蓝桥杯——九宫重排、青蛙跳杯子
1.历届试题 九宫重排 时间限制:1.0s 内存限制:256.0MB 问题描述 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着.与空格子相邻的格子中的卡片可以移动到空格中 ...
- 2017蓝桥杯省赛---java---C---9(青蛙跳杯子)
题目描述 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色.X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去.如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一 ...
- 第八届蓝桥杯真题解析javaC组
第八届蓝桥杯真题解析javaC组 文章目录 ***第八届蓝桥杯真题解析javaC组*** 前言 A.外星日历 B.兴趣小组 C.纸牌三角形 D.承压计算 E.杨辉三角 F.最大公共子串 G.Excel ...
- 第五届蓝桥杯真题解析【JavaC组】
第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...
- 蓝桥杯真题2017-2021
刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...
- python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。
python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...
- 【蓝桥杯真题】16天冲刺 Python
距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和 ...
最新文章
- 2021年大数据Spark(十九):Spark Core的​​​​​​​共享变量
- HDFS_API基本应用
- java架构师,必须掌握的几点技术?
- Java_异常_03_ java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
- python数学表达式_Python入门笔记——(1)数字与表达式
- call 存储过程时必须声明表示符_图解面试题:SQL存储过程有什么用?
- 如何使用新浪微博相册作为markdown的图床
- SAP UI5 component.js createContent
- php 电梯程序设计,教你写出京东电梯式轮播
- 重磅! SpringBoot+Sentinel+Nacos已撸完
- 进程串行变并行linux,linux进程简述
- 容易忘记的linux命令之rpm
- Android使用Zxing库生成PDF417扫描后多一个字符A
- dcs world f15c教学_你使用的DCS系统靠谱吗?!
- 自己动手恢复硬盘丢失数据
- ALU计算机专业术语,计算机专业术语大全
- 如何在3dmax中断开当前选中的链接
- 微信小程序开发(三)入门之创建打卡活动
- 阿里巴巴Java开发手册免费下载
- Cornerstone的分支问题Merge dry run failed: working copy is too old
热门文章
- 1000道阿里巴巴初级~高级Java工程师面试题(含答案,软件架构师之路阅读
- BZOJ4631 踩气球
- 有101根电线 每根的一头在楼底 另一端在楼顶 有一个灯泡 一个电池 无数根很短的电线 怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。
- 【转】window7下Word 2007报“Microsoft office word已停止工作“
- php如何获取当前日期时间函数,php如何使用date()函数获取当前时间
- 金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)
- MySQL学习之路(八):MySQL创建数据表
- DVWA——改GBK尝试宽字节注入(brute教程)
- MYSQL Function函数创建和调用
- 电脑系统时间变慢的原因,原来是这个没启动