【题目描述】
输入n代表有个n×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。
【输入】
首先输入一个n,表示测试样例的个数。
每个测试样例有三行。
第一行是棋盘的大小L(4≤L≤300);
第二行和第三行分别表示马的起始位置和目标位置(0…L−1)。
【输出】
马移动的最小步数,起始位置和目标位置相同时输出0。
【输入样例】
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1【输出样例】
5
28
0
思路
从起始点左边沿八个可行走的方向进行广搜,如果超过棋盘范围或是已经走过坐标的就不遍历
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main{
int[][] visit;
static int fx,fy;
static int[][] move = {{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}}; // 八个方向
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num=in.nextInt();
for(int i=0;i<num;i++) {
int n=in.nextInt();
int x=in.nextInt();
int y=in.nextInt();
fx=in.nextInt();
fy=in.nextInt();
System.out.println(BFS(n,x,y));
}
}
public static int BFS(int n,int x,int y) {
int[][] map = new int[n][n];
int[][] visit = new int[n][n];
Node start = new Node(x,y,0);
Queue<Node> queue = new LinkedList<Node>();
queue.offer(start);
visit[x][y]=1;
while(!queue.isEmpty()) {
Node next = queue.poll();
if(next.x==fx &&next.y==fy)
return next.step;
for(int i=0;i<8;i++) {
x=next.x+move[i][0];
y=next.y+move[i][1];
if(x>=0 && x<n && y>=0 && y<n && visit[x][y]==0) {
queue.offer(new Node(x,y,next.step+1));
visit[x][y]=1;
}
}
}
return n;
}
}
class Node{
int x;
int y;
int step;
Node(int x,int y,int step){
this.x=x;
this.y=y;
this.step=step;
}
}