运用 HashMap + ArrayDeque + StringBuilder
import java.util.ArrayDeque;
import java.util.HashMap;
import java.util.Scanner;
class node{
String s;
int step;
}
public class Main {
static String s,e;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
HashMap<String, Integer> m=new HashMap<String, Integer>();
s=sc.next();
e=sc.next();
node p=new node();
p.s=s;
p.step=0;
ArrayDeque<node> q=new ArrayDeque<node>();
q.offer(p);
m.put(s, 1);
int flag=0;
while(!q.isEmpty())
{
node u=q.peek();
if(u.s.equals(e)) //注意java的字符串判等不能是==,而是equals
{
System.out.println(u.step);
}
q.pop();
int d=u.s.indexOf("*"); //先找到*的位置
//下面是判断所有可能跳的位置
if(d-1>=0)
{
//替换一个字符串中的两个字符用的是StringBuilder中的replace(start,end,str);
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d-1)+"");
s.replace(d-1, d, ch+"");
if(!m.containsKey(s.toString())) //利用HashMap保证已经到达过的点不会再到达
{
m.put(s.toString(), 1);
node pp=new node(); //java这里要new,申请空间
pp.s=s.toString(); //StringBuilder转String
pp.step=u.step+1;
q.offer(pp);
}
}
if(d-2>=0)
{
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d-2)+"");
s.replace(d-2, d-1, ch+"");
if(!m.containsKey(s.toString()))
{
m.put(s.toString(), 1);
node pp=new node();
pp.s=s.toString();
pp.step=u.step+1;
q.offer(pp);
}
}
if(d-3>=0)
{
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d-3)+"");
s.replace(d-3, d-2, ch+"");
if(!m.containsKey(s.toString()))
{
m.put(s.toString(), 1);
node pp=new node();
pp.s=s.toString();
pp.step=u.step+1;
q.offer(pp);
}
}
if(d+1<u.s.length())
{
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d+1)+"");
s.replace(d+1, d+2, ch+"");
if(!m.containsKey(s.toString()))
{
m.put(s.toString(), 1);
node pp=new node();
pp.s=s.toString();
pp.step=u.step+1;
q.offer(pp);
}
}
if(d+2<u.s.length())
{
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d+2)+"");
s.replace(d+2, d+3, ch+"");
if(!m.containsKey(s.toString()))
{
m.put(s.toString(), 1);
node pp=new node();
pp.s=s.toString();
pp.step=u.step+1;
q.offer(pp);
}
}
if(d+3<u.s.length())
{
StringBuilder s=new StringBuilder();
s.append(u.s);
char ch=s.charAt(d);
s.replace(d, d+1, s.charAt(d+3)+"");
s.replace(d+3, d+4, ch+"");
if(!m.containsKey(s.toString()))
{
m.put(s.toString(), 1);
node pp=new node();
pp.s=s.toString();
pp.step=u.step+1;
q.offer(pp);
}
}
}
}
}
}