BFS_3:马的遍历
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入
3 3 1 1
输出
0 3 2
3 -1 1
2 1 4
问题分析
马的走法想必都知道,然后就要确定行走的坐标xx和yy。
要注意的点是:要是马走不到的点输出-1,所以一开始全棋盘为-1
然后当马可以走到的时候就将该点的dis赋值给mp相当于步数即可
这样可以减少一个vis的开销
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node_3{
public int x;
public int y;
public int dis;
public Node_3(int x, int y) {
this.x = x;
this.y = y;
}
public Node_3(int x, int y, int dis) {
this.x = x;
this.y = y;
this.dis = dis;
}
}
public class BFS_3 {
static int N = 410;
static int n,m,sx,sy;
static int[][] mp = new int[N][N];
static int[] xx = {1,2,2,1,-1,-2,-2,-1};
static int[] yy = {-2,-1,1,2,2,1,-1,-2};
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();m = scanner.nextInt();
sx = scanner.nextInt();sy = scanner.nextInt();
//先初始化数组mp全部为-1,因为mp中马能走到的点都改为对应的数字,-1标识不能到达,也就算是vis的功能
for (int i = 1; i <= n ; i++) {
for (int j = 1; j <= m ; j++) {
mp[i][j] = -1;
}
}
Node_3 start = new Node_3(sx,sy,0);
bfs(start);
for (int i = 1; i <= n ; i++) {
for (int j = 1; j <= m ; j++) {
System.out.printf("%-5d",mp[i][j]);
}
System.out.println();
}
}
private static void bfs(Node_3 start) {
//将起点的mp设置为0
mp[start.x][start.y] = 0;
Queue<Node_3> queue = new LinkedList<>();
//将首节点进入队列
queue.offer(start);
while(!queue.isEmpty()){
//取出首节点
Node_3 cur = queue.peek();
for (int i = 0; i < 8; i++) {
int dx = cur.x + xx[i];
int dy = cur.y + yy[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&mp[dx][dy]==-1){
Node_3 temp = new Node_3(dx,dy);
mp[dx][dy] = cur.dis + 1;
temp.dis = cur.dis + 1;
queue.offer(temp);
}
}
queue.poll();
}
}
}