算法基础之走迷宫

走迷宫

  • 核心思想:BFS宽度优先搜索

    • 每走到一个点 上下左右都走一次试试 能过去就记录上

    •   #include
        #include
        #include
        #include
        
        
        using namespace std;
        typedef pair<int,int> PII;
        const int N=110;
        
        int n,m;
        //g存迷宫 d存距离以及是否走过	
        int g[N][N],d[N][N];
        
        
        int bfs(){
            //用队列将遍历到的点存入
            queue<PII> q;
        
            //d赋值-1 如果还是-1说明没走过
            memset(d, -1, sizeof d);
            d[0][0] = 0;
            q.push({0, 0});
            
            //上下左右四个方位的xy变化量
            int dx[4] = {-1,0,1,0}, dy[4] = {0,1,0,-1};
            
            while(q.size()){
                //取出队列中第一个元素 最近加入的点
                auto t =q.front();
                q.pop();
                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] == 0&&d[x][y] ==-1){  //判断能不能走
                        d[x][y] = d[t.first][t.second] +1;  //距离+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++){
                    cin>>g[i][j];
                }
            }
            
            cout<<bfs()<<endl;
            
            return 0;
        }
      

你可能感兴趣的:(算法)