题目描述
询问至少需要几步,才能跳成另一个目标局面?
样例
输入:
⭐WWBB
WWBB⭐
输出:
2
解题思路:
1.BFS遍历所有状态,储存状态及其对应的步数;
2.发现和结果吻合则退出。
注意事项:
1.使用字典存储某一状态和对应步数,便于查找重复状态,降低时间复杂度;
2.不要使用列表存储状态,因为列表不能作为字典键值,而应用字符串;
3.“跳杯”的过程可以用列表实现。
import java.util.*;
public class Main {
public static int answer;
public static int[] X={-3,-2,-1,1,2,3};
public static Map<String,Integer> map=new HashMap<>();//存储字符串,可以达到检查是否重复的效果
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s1=scan.next();//初始状态
String s2= scan.next();//目标状态
//找到空杯子的位置
int ii=0;
for (int i = 0; i < s1.length(); i++) {
if(s1.charAt(i)=='*'){
ii=i;
break;
}
}
//搜索
node start=new node();
start.count=0; start.x=ii; start.s=s1;
Deque<node> que=new LinkedList<>();
que.offer(start);
while(!que.isEmpty()){
node now=que.poll();
if(now.s.equals(s2)){
answer= now.count;
break;
}
for (int i = 0; i < 6; i++) {
int newx= now.x+X[i];
if(newx>=0&&newx<s1.length()){
//创建修改后的字符串
StringBuilder sb=new StringBuilder(now.s);
char temp= sb.charAt(now.x);
sb.setCharAt(now.x, sb.charAt(newx));
sb.setCharAt(newx,temp);
String news= sb.toString();
if(map.get(news)!=null){
//出现重复字符串
continue;
}else{
map.put(news, 1);
node next=new node();
next.x=newx;
next.count= now.count+1;
next.s=news;
que.offer(next);
}
}
}
}
//输出答案
System.out.println(answer);
scan.close();
}
}
class node{
int x;//空杯子所在坐标
int count;//步数
String s;//字符串当前状态
}