题目描述
有一个 𝑛×𝑚n×m 的棋盘,在某个点 (𝑥,𝑦)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。
输入格式
输入只有一行四个整数,分别为 𝑛,𝑚,𝑥,𝑦n,m,x,y。
输出格式
一个 𝑛×𝑚n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1−1)。
输入输出样例
输入 #1复制
3 3 1 1
输出 #1复制
0 3 2 3 -1 1 2 1 4
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤𝑥≤𝑛≤4001≤x≤n≤400,1≤𝑦≤𝑚≤4001≤y≤m≤400。
#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct xy {
int x, y, bs;
}zb, now;
int n, m, a, b, res[402][402];
bool vis[402][402];
queue <xy> act;
int dirx[8] = { 2,2,1,-1,-2,-2,1,-1 };
int diry[8] = { 1,-1,2,2,1,-1,-2,-2 };
void bfs()
{
while (!act.empty())
{
now = act.front();
act.pop();
for (int i = 0;i < 8;i++)
{
if (now.x + dirx[i] > 0 && now.x + dirx[i] <= m && now.y + diry[i] <= n && now.y + diry[i] > 0&&vis[now.y + diry[i]][now.x + dirx[i]]==false)
{
zb.x = now.x + dirx[i];
zb.y = now.y + diry[i];
zb.bs = now.bs + 1;
act.push(zb);
vis[zb.y][zb.x] = 1;
res[zb.y][zb.x] = zb.bs;
}
}
}
}
int main()
{
cin >> n >> m >> a >> b;
zb.x = b;
zb.y = a;
zb.bs = 0;
act.push(zb);
vis[a][b] = 1;
res[a][b] = 0;
bfs();
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= m;j++)
{
if (res[i][j]!=0)
{
printf("%-5d", res[i][j]);
}
else if (i == a && j == b)
printf("%-5d", 0);
else
printf("%-5d", -1);
}
cout << endl;
}
}