洛谷P1443 马的遍历

题目描述

有一个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<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;
}

posted @ 2020-05-15 17:42  weijianzhen  阅读(120)  评论(0编辑  收藏  举报