原题目地址:https://www.luogu.org/problem/show?pid=1443
题目描述
题目描述
有一个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
比较经典的BFS,再加一个记录步数的数组就可以了。
#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,cx[8]={1,1,2,2,-1,-1,-2,-2},cy[8]={2,-2,1,-1,2,-2,1,-1},s,a[401][401],l,r,b[401][401];
struct s
{
int x;
int y;
int p;
}d[40001];
void bfs()
{
d[0].x=sx;d[0].y=sy;d[0].p=0;a[sx][sy]=0;
int t,w=1;
while(t<w)
{
for(int i=0;i<8;i++)
{
int xx=d[t].x+cx[i],yy=d[t].y+cy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==-1)
{ a[xx][yy]=d[t].p+1;
d[w].x=xx,d[w].y=yy,d[w].p=d[t].p+1,b[xx][yy]=d[t].p,w++;
}
}
t++;
}
}
int main()
{
cin>>n>>m>>sx>>sy;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=-1;
bfs();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
j==m?printf("%-5d\n",a[i][j]):printf("%-5d",a[i][j]);
return 0;
}