题目描述
有一个 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。
2022 年 8 月之后,本题去除了对输出保留场宽的要求。为了与之兼容,本题的输出以空格或者合理的场宽分割每个整数都将判作正确。
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=410;
int n,m,x,y;
int dist[N][N];
typedef pair<int,int> PII;
int dx[]={1,2,2,1,-1,-2,-1,-2};
int dy[]={2,1,-1,-2,-2,-1,2,1};
void bfs()
{
memset(dist,-1,sizeof dist);
queue<PII> q;
dist[x][y]=0;
q.push({x,y});
while(q.size())
{
auto t=q.front();
q.pop();
int z=t.first,k=t.second;
for(int i=0;i<8;i++)
{
int x=z+dx[i];
int y=k+dy[i];
if(x<1||x>n||y<1||y>m)
continue;
if(dist[x][y]!=-1)
continue;
dist[x][y]=dist[z][k]+1;
q.push({x,y});
}
}
}
int main()
{
cin>>n>>m>>x>>y;
bfs();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<dist[i][j]<<" ";
}
cout<<endl;
}
return 0;
}