洛谷P1443 马的遍历
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入格式
一行四个数据,棋盘的大小和马的坐标
输出格式
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
3 3 1 1
0 3 2 3 -1 1 2 1 4
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct wjz{
int x,y,d;
};
int ans[410][410];
bool vis[410][410];
int dx[8]={1,2,-1,-2,1,2,-1,-2};
int dy[8]={2,1,2,1,-2,-1,-2,-1};
queue<wjz> Q;
wjz w;
int main()
{
memset(ans,-1,sizeof(ans));
int m,n,a,b;
cin>>n>>m>>a>>b;
ans[a][b]=0;
vis[a][b]=1;
Q.push((wjz){a,b,0});
while(!Q.empty())
{
w=Q.front();
Q.pop();
for(int i=0;i<=7;i++)
{
int ax=w.x+dx[i],ay=w.y+dy[i];
if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&vis[ax][ay]==0)
{
Q.push((wjz){ax,ay,w.d+1});
ans[ax][ay]=w.d+1;
vis[ax][ay]=1;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%-5d",ans[i][j]);
cout<<endl;
}
return 0;
}