题目
题目描述:
你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
+---+---+---+
| A | * | * |
+---+---+---+
| B | | * |
+---+---+---+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入:
输入两行6个字符表示当前的局面
输出:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
样例输入
* A **B
样例输出
17
思路
这题用广搜来解决。判重数组我用了set,把序列用字符串表示然后加入set中。
这里有个坑
中间我写step s = q;就不行只会入队一次就结束了
必须把q的信息完全拷贝才行。
到现在我还不是太清楚这个原理 留个坑,以后补
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static class step{
int x,y; //储存广搜队列节点的坐标
int num; //广搜的步数
char[][] maze=new char[2][3]; //在这一步时,当时棋盘的状态
step(){
}
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
step a=new step(); //声明A棋子
step b=new step(); //声明B棋子
step zero=new step(); //声明空格
Queue<step> queue=new LinkedList(); //广搜队列
String[] str = new String[2];
for(int i=0;i<2;i++) { //存储地图
str[i]=scan.nextLine();
for(int j=0;j<3;j++) {
zero.maze[i][j]=str[i].charAt(j);
if(zero.maze[i][j]=='A') {
a.x=i; //A的坐标
a.y=j;
}else if(zero.maze[i][j]=='B') {
b.x=i; //B的坐标
b.y=j;
}else if(zero.maze[i][j]==' ') {
zero.x=i; //空格的坐标
zero.y=j;
}
}
}
zero.num=0; //初始化空格的步数为0
queue.add(zero); //将空格加入队列进行广搜
Set<String> book=new TreeSet(); //判重Set
book.add((str[0]+str[1])); //将初始情况放入队列
int[] dirX= {0,0,1,-1}; //拓展方向
int[] dirY= {1,-1,0,0};
while(!queue.isEmpty()) { //对空格进行广搜
step q=queue.remove();
if(q.maze[a.x][a.y]=='B'&&q.maze[b.x][b.y]=='A')
{ //当A与B交换位置时,找到结果,结束广搜
System.out.println(q.num);
break;
}
for(int i=0;i<4;i++) { //向四个方向拓展
String s="";
step t=new step(); //就是这 一个大坑。。检查好多遍不知道哪错了
t.x=q.x;t.y=q.y;t.num=q.num;
for(int k=0;k<2;k++) {
for(int r=0;r<3;r++) {
t.maze[k][r]=q.maze[k][r];
}
}
int tx=q.x+dirX[i];
int ty=q.y+dirY[i];
if(tx>=0&&ty>=0&&tx<2&&ty<3) { //如果拓展的坐标还在棋盘内
char temp=t.maze[tx][ty];
t.maze[tx][ty]=t.maze[t.x][t.y]; //交换空格与拓展的位置
t.maze[t.x][t.y]=temp;
t.num++;
t.x=tx;
t.y=ty;
for(int k=0;k<2;k++) { //用String记录棋盘情况进行判重
for(int r=0;r<3;r++) {
s+=t.maze[k][r];
}
}
if(!book.contains(s)) {
book.add(s);
queue.add(t);
}
}
}
}
}
}