题目大意
题目描述
有一个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; }
本题难度 普及/提高-