题目描述
有一个 n×m 的棋盘,在某个点(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 n,m,x,y。
输出格式
一个 n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出−1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤x≤n≤400,1≤y≤m≤400。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <utility>
#include <cmath>
#include <queue>
using namespace std;
const int dx[8] = {2,2,1,1,-1,-1,-2,-2};
const int dy[8] = {1,-1,2,-2,2,-2,1,-1};
queue<pair<int,int>> q;
int f[405][405];
bool v[405][405];
int main()
{
int n, m, x, y;
memset(f,-1,sizeof(f));
cin >> n >> m >> x >> y;
f[x][y] = 0;
v[x][y] = 1;
q.push(make_pair(x,y));
while(!q.empty())
{
int xx = q.front().first, yy = q.front().second;
q.pop();
for (int i=0; i<8; i++)
{
int a = xx+dx[i], b = yy+dy[i];
if (a<1 || a>n || b<1 || b>m || v[a][b]) continue;
v[a][b] = 1;
q.push(make_pair(a,b));
f[a][b] = f[xx][yy]+1;
}
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
printf("%-5d",f[i][j]);
}
cout << endl;
}
return 0;
}