https://www.luogu.org/problem/show?pid=1443#sub
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1:
3 3 1 1
输出样例#1:
0 3 2
3 -1 1
2 1 4
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <queue> using namespace std; const int N();
int n,m,x,y; struct Node
{
int x,y;
}node;
int cnt[N][N],vis[N][N];
int fx[]={,,,,-,-,-,-};
int fy[]={,-,,-,,-,,-};
queue<Node>que;
void BFS(Node s)
{
que.push(s); cnt[s.x][s.y]=;
for(;!que.empty();)
{
Node a,fro=que.front();que.pop();
for(int i=;i<;i++)
{
int xx=fro.x+fx[i],yy=fro.y+fy[i];
if(cnt[xx][yy]!=-||xx<||yy<||xx>n||yy>m) continue;
cnt[xx][yy]=cnt[fro.x][fro.y]+;
a.x=xx,a.y=yy; que.push(a);
}
}
} int main()
{
scanf("%d%d%d%d",&n,&m,&node.x,&node.y);
memset(cnt,-,sizeof(cnt));
BFS(node);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
printf("%-5d",cnt[i][j]);
printf("\n");
}
return ;
}