题目描述
8*8的国际象棋棋盘上,行号为a到h,列号为1到8,根据马的起始位置和目标位置,请你编程计算马跳的最小步数。
输入
若干行,每行包含4个字符,前2个字符表示起始位置的行号与列号,后2个字符表示目标位置的行号与列号。最后一行的为i0i0(这行不需要计算马跳的步数)。
输出
若干行整数,对每行输入,输出一个整数,表示马跳的最小步数。
样例输入
e2e4
a1b2
b2c3
a1h8
a1h7
h8a1
b1c3
f6f6
i0i0样例输出
2
4
2
6
5
6
1
0
思路
从起始位置开始沿着八个方向广搜即可
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[][] map = new int[9][9];
static boolean[][] visit = new boolean[9][9];
static int[][] move = {{1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1}};
static int x,y,x1,y1;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s;
while(true) {
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
visit[i][j]=false;
s = in.nextLine();
if(s.charAt(0)=='i') {
break;
}
x=s.charAt(0)-'a';
y=s.charAt(1)-'1';
x1=s.charAt(2)-'a';
y1=s.charAt(3)-'1';
if(x==x1 && y==y1) {
System.out.println(0);
break;
}
BFS();
}
}
public static void BFS() {
Queue<Node> queue = new LinkedList<Node>();
Node start = new Node(x,y,0);
queue.offer(start);
visit[x][y]=true;
while(!queue.isEmpty()) {
Node next = queue.poll();
for(int i=0;i<8;i++) {
x = next.x+move[i][0];
y = next.y+move[i][1];
if(x==x1 && y==y1) {
System.out.println(next.step+1);
return;
}
if(x>=0 && x<8 && y>=0 && y<8 && !visit[x][y]) {
queue.offer(new Node(x,y,next.step+1));
visit[x][y]=true;
}
}
}
}
}
class Node {
int x;
int y;
int step;
Node(int x,int y,int step){
this.x=x;
this.y=y;
this.step=step;
}
}