题目大意
题目描述
有一个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
思路
广搜+STL队列 使用结构体变量 Pos 存储坐标 使用二维数组 map[401][401] 存储地图(答案) 使用常量数组 dx[] dy[] 存储马可以走的8个方向 使用 Pos 类型队列维护坐标点的值
代码实现
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
struct Pos //结构体变量Pos,存储马x、y坐标的值
{
int x,y;
};
queue <Pos> q; //定义一个Pos类型队列q
int n,m,tx,ty,mp[401][401],x,y;
const int dx[]={-1,-1,-2,-2,1,1,2,2};
const int dy[]={-2,2,-1,1,-2,2,-1,1}; //马的8个方向
void bfs(int sx,int sy)
{
q.push((Pos){sx,sy}); //插入值的方法
mp[sx][sy]=0;
while(!q.empty())
{
x=q.front().x;
y=q.front().y;
q.pop();
for(int i=0;i<8;i++)
{
tx=x+dx[i];
ty=y+dy[i];
if(tx<=0||tx>n||ty<=0||ty>m) continue;
if(mp[tx][ty]!=-1) continue;
mp[tx][ty]=mp[x][y]+1;
q.push((Pos){tx,ty});
}
}
}
int main()
{
memset(mp,-1,sizeof(mp));
int sx,sy;
scanf("%d %d %d %d",&n,&m,&sx,&sy);
bfs(sx,sy);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%-5d",mp[i][j]); //注意输出格式
printf("\n");
}
return 0;
}
本题难度 普及/提高-