题目描述
有一个 n 行 m 列的棋盘( 1<n,m≤400 ),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入
一行四个整数,分别表示棋盘大小 n,m 和马的位置 x,y。
输出
一个 n∗m 的矩阵,代表马到达某个点最少要走几步,每两个数之间用空格隔开,若此点不可达则输出 −1。
样例输入
3 3 1 1
样例输出
0 3 2
3 -1 1
2 1 4
数据规模与约定
时间限制:1 s
内存限制:256 M
100% 的数据保证 1<n,m≤400
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct node {
int x, y, cnt;
};
int dir[8][2] = { 1,2,2,1,1,-2,-2,1,-1,2,2,-1,-1,-2,-2,-1};
int main() {
int n, m, x, y;
cin >> n >> m >> x >> y;
int num[405][405];
memset(num, -1, sizeof(int) * 405 * 405);
queue<node> que;
que.push({ x,y,0 });
num[x][y] = 0;
while (!que.empty()) {
node temp = que.front();
que.pop();
for (int i = 0; i < 8; i++) {
int x = temp.x + dir[i][0];
int y = temp.y + dir[i][1];
if (x <= 0 || y <= 0 || x > n || y > m) {
continue;
}
if (num[x][y] == -1) {
que.push({ x,y,temp.cnt + 1 });
num[x][y] = temp.cnt + 1;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (j != 1) cout << " ";
cout << num[i][j];
}
cout << endl;
}
return 0;
}