解题思路:
注意事项:
参考代码:
import java.util.Scanner;
public class Main {
static char a[][]=new char[3][3];//初始状态
private static int[][] b=new int [][]{{0,1},{1,0},{-1,0},{0,-1}};//四个移动方向
private static int[][] v=new int[10][10];
private static int count=0,min=Integer.MAX_VALUE;
private static char[][] c=new char[3][3];//存放最终状态
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String str=input.next();
String str2=input.next();
int x = 0,y = 0,k=0,endx=0,endy=0;//记录开始点的坐标,和最终点的坐标
for (int i= 0; i<3; i++) {
for (int j = 0; j<3; j++) {
a[i][j]=str.charAt(k++);
if(a[i][j]=='.'){
x=i;
y=j;
}
}
}
k=0;
for (int i= 0; i<3; i++) {
for (int j = 0; j<3; j++) {
c[i][j]=str2.charAt(k++);
if(c[i][j]=='.'){
endx=i;
endy=j;
}
}
}
dfs(x,y,endx,endy);
if(min==Integer.MAX_VALUE)System.out.println(-1);
else
System.out.println(min);
}
private static void dfs(int x, int y, int endx, int endy) {
if(x==endx&&y==endy){//如果“.“走到最终状态位置
if(check()){//判断是否与终太一样
if(min>=count)min=count;//记录最少步数
}
return;
}else
for (int i = 0; i <4; i++) {
if(b[i][0]+x<3&&b[i][0]+x>=0&&b[i][1]+y<3&&b[i][1]+y>=0&&v[b[i][0]+x][b[i][1]+y]==0){//未走过且没有出边界
v[x][y]=1;//标记以走
count++;//步数加一
char k=a[x][y];//交换位置
a[x][y]=a[b[i][0]+x][b[i][1]+y];
a[b[i][0]+x][b[i][1]+y]=k;
dfs(b[i][0]+x,b[i][1]+y,endx,endy);
count--;
k=a[x][y];
a[x][y]=a[b[i][0]+x][b[i][1]+y];
a[b[i][0]+x][b[i][1]+y]=k;
v[x][y]=0;
}
}
}
private static boolean check() {
for (int i= 0; i<3; i++) {
for (int j = 0; j<3; j++) {
if(a[i][j]!=c[i][j])return false;
}
}
return true;
}
}
0.0分
0 人评分
ASCII帮了大忙浏览:797 |
P1001 (C语言代码)浏览:836 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:562 |
WU-链表数据求和操作 (C++代码)浏览:1382 |
三角形 (C++代码)记忆化搜索浏览:1317 |
哥德巴赫曾猜测 (C语言代码)浏览:2560 |
整数平均值 (C语言代码)浏览:856 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:606 |
小O的乘积 (C语言代码)浏览:1062 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:841 |