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