蓝桥杯-历届试题 青蛙跳杯子

匿名 (未验证) 提交于 2019-12-02 23:34:01

问题描述

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

*WWWBBB

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

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

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

WWW*BBB

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

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

样例输入

WWBB
WWBB

样例输出

2

样例输入

WWWBBB
BBB
WWW

样例输出

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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!