点击查看:蓝桥杯历年真题 题解目录
青蛙跳杯子
解析:
1. 求最少步数,首先想到的是宽搜
2. 定义一个静态内部类,用来存储每个状态的字符串和步数。
3. 对于宽搜,用到的数据结构是队列,首先将初始状态入队。判断队列不为空,每弹出一个node,将此状态演变出的其他状态依次加入队列。
4. 在加入队列时,一定要判重,否则就会将上一步的状态加入队列,从而出现环而出错,这里用了set判重。
5. 当演变出的状态与目标状态相同时,输出结果,返回即可。
package java_2017_C;
/**
* @author Ren
*/
import java.util.*;
public class Main009_青蛙跳杯子 {
static String s1,s2;
static int n;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
s1 = in.next();
s2 = in.next();
n = s1.length();
bfs();
}
static Set<String> set = new HashSet<String>();
private static void bfs() {
Queue<Node> q = new LinkedList<Node>();
q.add(new Node(s1,0));
set.add(s1);
while(!q.isEmpty()){
Node u = q.poll();
if(u.s.equals(s2)){
System.out.println(u.t);
break;
}
char [] ch = u.s.toCharArray();
int index = u.s.indexOf('*');
for (int i = -3; i <= 3; i++) {
if(index+i>=0 && index+i<n && i!=0){
swap(ch,index,index+i);
String n_s = new String(ch);
if(!set.contains(n_s)){
set.add(n_s);
q.add(new Node(n_s,u.t+1));
}
swap(ch,index,index+i);
}
}
}
}
private static void swap(char [] ch, int i, int j) {
char t = ch[i]; ch[i] = ch[j] ; ch[j] = t;
}
static class Node{
String s;
int t;
public Node(String s, int t) {
this.s = s;
this.t = t;
}
}
}