革命尚未成功

————同志仍需努力————

shinnyblue

导航

AC.844 走迷宫

 

 

 

#include<iostream>
#include<queue>
#include<utility>//pair容器的头文件
#include<cstring>//memset
using namespace std;
const int N = 1e2+7;
int n,m;
int g[N][N],d[N][N];//g数组用来存储迷宫地图,d数组用来存储每个位置到起点的距离
queue <pair<int,int>> q;
int bfs()
{
    int dx[]={-1,0,1,0},dy[]={0,1,0,-1};//定义方向数组
    memset(d,-1,sizeof(d));//把d数组的全部元素初始化为-1,用于标记未被访问过的坐标 
    d[0][0]=0;//起点到起点的距离为0
    q.push({0,0});//知道d[横坐标][纵坐标]的值后,就将此点纳入讨论范畴(讨论它的上下左右),此处是对起点进行如此操作,后续所有点都是这样:先知其距离,再论其邻居
    while (!q.empty())
    {
        auto t=q.front();//t其实是个pair
        //也可以这么写 pair<int,int> t= q.front();
        q.pop();//形象化描述:q.front()交给临时变量后(登个记)就可以放心走了
        for (int i = 0; i < 4; i++)
        {
            int x=t.first+dx[i],y=t.second+dy[i];
            if (x>=0 && x<n && y>=0 && y<m && g[x][y]!=1 && d[x][y]==-1)
            {
                d[x][y]=d[t.first][t.second]+1;
                q.push({x,y});
            }
            
        }
        
    }
    return d[n-1][m-1];
}
int main()
{
    cin>>n>>m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            scanf("%d",&g[i][j]);
        }
    }
    cout<<bfs()<<endl;
    return 0;
}

 

posted on 2023-03-11 10:53  ShinnyBlue  阅读(9)  评论(0编辑  收藏  举报

Live2D