解题思路:
注意事项:
参考代码:
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 人评分
IP判断 (C语言描述,蓝桥杯)浏览:1095 |
1012题解浏览:869 |
Tom数 (C语言代码)浏览:725 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:469 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:359 |
计算质因子 (Java代码)浏览:745 |
WU-C语言程序设计教程(第三版)课后习题12.5 (C++代码)浏览:974 |
WU-IP判断 (C++代码)(一种有趣的实现方法)浏览:1497 |
数列 (C语言代码)浏览:1937 |
母牛生小牛 (C语言代码)浏览:993 |