问题描述
X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。
X星的青蛙很有些癖好,它们只做3个动作之一:
1. 跳到相邻的空杯子里。
2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要1步,就可跳成下图局面:
WWW*BBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。
输入为2行,2个串,表示初始局面和目标局面。
输出要求为一个整数,表示至少需要多少步的青蛙跳。
样例输入
WWBB
WWBB
样例输出
2
样例输入
WWWBBB
BBBWWW
样例输出
10
数据规模和约定
我们约定,输入的串的长度不超过15
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import java.util.Scanner; public class Main{ static Map<String,Integer> map; static Queue<String> q; static String s,t; public static void main(String[] args){ Scanner sc = new Scanner(System.in); s = sc.nextLine(); // 起始状态 t = sc.nextLine(); // 最终状态 // 由起始状态经过value次变换到可以变为当前key状态 map = new HashMap<String,Integer>(); // 队列,保存不同的可能状态 q = new LinkedList<String>(); map.put(s, 0); q.add(s); int cnt = bfs(); System.out.println(cnt); } // 宽度优先搜索 private static int bfs() { while(!q.isEmpty()){ String now = q.peek(); // 获取队首元素 q.poll(); // 将队首元素从队列中弹出 if(now.equals(t)){ // 已变换为最终状态的字符串 return map.get(t); } // 找到*所在的位置 int pos = 0; for(int i=0;i<now.length();i++){ if(now.charAt(i)=='*'){ pos = i; break; } } // *右边相邻的杯子里有青蛙 if(pos+1<now.length()) add(now,pos,pos+1); // *右边隔一个杯子位置有青蛙 if(pos+2<now.length()) add(now,pos,pos+2); // *右边隔两个杯子的位置有青蛙 if(pos+3<now.length()) add(now,pos,pos+3); // *左边相邻的位置有青蛙 if(pos-1>=0) add(now,pos,pos-1); // *左边隔一个杯子位置有青蛙 if(pos-2>=0) add(now,pos,pos-2); // *左边隔两个杯子的位置有青蛙 if(pos-3>=0) add(now,pos,pos-3); } return 0; } // 将青蛙从第pos个位置跳到第i个位置的情况记录下来 private static void add(String now, int pos, int i) { // 青蛙从第pos个位置跳到第i个位置 String tp = swap(now,pos,i); if(!map.containsKey(tp)||map.get(tp)==0){ // 变换到当前状态的次数=已变换的次数+1 map.put(tp, map.get(now)+1); q.add(tp); } } // 青蛙从第pos个位置跳到第i个位置 private static String swap(String now, int pos, int i) { char[] ch = now.toCharArray(); char mid = ch[pos]; ch[pos] = ch[i]; ch[i] = mid; return new String(ch); } }
文章来源: https://blog.csdn.net/weixin_41549033/article/details/90111597