题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入样例:
3 3 1 1
输出样例:
0 3 2
3 -1 1
2 1 4
思路
从起始点开始沿马能走的八个方向广搜即可,如果超过棋盘的范围或是已访问过的坐标就不再访问,每访问一个坐标将步长记下
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int[][] map;
static boolean[][] visit;
static int[][] move = {{1,2},{2,1},{-1,-2},{-2,-1},{1,-2},{-2,1},{-1,2},{2,-1}};
static int n,m;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
int x = in.nextInt();
int y = in.nextInt();
map = new int[n][m];
visit = new boolean[n][m];
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
map[i][j]=-1;
}
}
BFS(x-1,y-1);
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
System.out.print(map[i][j] + " ");
}
System.out.println("");
}
}
public static void BFS(int x,int y) {
Queue<Node> queue = new LinkedList<Node>();
Node start = new Node(x,y,0);
queue.offer(start);
map[x][y]=start.step;
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>=0 && x<n && y>=0 && y<m && !visit[x][y]) {
queue.offer(new Node(x,y,next.step+1));
map[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;
}
}
版权声明:本文为qq_32591993原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。