问题描述
一个8×8的棋盘上有一个马初始位置为(a,b),他想跳到(c,d),问是否可以?如果可以,最少要跳几步?
输入格式
一行四个数字a,b,c,d。
输出格式
如果跳不到,输出-1;否则输出最少跳到的步数。
样例输入
1 1 2 3
样例输出
1
数据规模和约定
0<a,b,c,d≤8且都是整数。
分析题目
每跳一步都有八种选择,用DFS全排列所有情况(舍弃一些不符合的情况),记录每个落点的最少步数
java代码
import java.util.*;
public class Test {
static int n,m,x,y;
static int sum=0;
static boolean isFind=false;
static int[][] min=new int[9][9];
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
x=Integer.parseInt(sc.next())-1;
y=Integer.parseInt(sc.next())-1;
n=Integer.parseInt(sc.next())-1;
m=Integer.parseInt(sc.next())-1;
dfs(x,y,0);
System.out.println(isFind?sum:-1);
}
static void dfs(int x,int y,int i){
if(x<0 || x>8 || y<0 || y>8) return; //超出界限的直接return
if(i>0 && x==Test.x && y==Test.y) return; //排除起点
if(x==n&&y==m){
sum=i;
isFind=true;
return;
}else {
if(min[x][y]!=0 && min[x][y]<i){ //排除步数大于之前记录的
return;
}else { //小于之前的步数或者等于零的情况
min[x][y]=i;
i++;
dfs(x-1,y-2,i); dfs(x+1,y-2,i);
dfs(x-2,y-1,i); dfs(x+2,y-1,i);
dfs(x-2,y+1,i); dfs(x+2,y+1,i);
dfs(x-1,y+2,i); dfs(x+1,y+2,i);
}
}
}
}