[广度优先搜索]马的遍历

女生的网名这么多〃 提交于 2019-11-26 13:58:10

 题目大意


题目描述 

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

 


本题难度 普及/提高-

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!