7-13 马踏棋盘 (30 分)
有一个 n×m的棋盘,在某个点 (x, y) 上有一个马,要求计算出马到达棋盘上任意一个点最少要走几步。
数据规模:对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。

输入格式:
输入一行四个整数,分别为 n, m, x, y。
输出格式:
一个 n×m 的矩阵,表示马到达某个点最少要走几步(左对齐,宽 5 格,不能到达输出 −1)。
输入样例:
3 3 1 1
输出样例:
在这里给出相应的输出。例如:
0 3 2
3 -1 1
2 1 4
#include<bits/stdc++.h>
using namespace std;
int n, m, x, y;
int num[401][401];
int vis[401][401];
int mum[401][401];
int dir[8][2]= {{1,2},{2,1},{2,-1},{-1,2},{1,-2},{-1,-2},{-2,-1},{-2,1}};
struct Node{
int xx;
int yy;
int index = 0;
void is_Index(int a, int b, int c){
xx = a;
yy = b;
index = c;
}
};
void Bfs(int x1, int y1){
int sum = 0;
num[x][y] = 1;
queue<Node> Qu;
Node node;
node.xx = x;
node.yy = y;
node.index = 0;
Qu.push(node);
num[x][y] = 0;
vis[x][y] = 1;
while(!Qu.empty()){
Node node = Qu.front();
Qu.pop();
sum = node.index + 1;
for(int i = 0; i < 8; i++){
int a = node.xx + dir[i][0];
int b = node.yy + dir[i][1];
if(a <= n && b <= m && !vis[a][b] && a > 0 && b > 0){
Node node1;
node1.is_Index(a,b, sum);
num[a][b] = sum;
vis[a][b] = 1;
Qu.push(node1);
}
}
}
}
int main(){
cin >> n >> m >> x >> y;
fill(num[0],num[0] + 401 * 401, -1);
Bfs(x, y);
num[x][y] = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
printf("%-5d", num[i][j]);
}
cout << endl;
}
return 0;
}