题解 | #C++迷宫问题#

迷宫问题

http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

BFS解迷宫问题

注释很详细,直接上代码

//BFS求解迷宫问题
//BFS可用于求解最短路径的问题
#include <bits/stdc++.h>
using namespace std;
int dx[4]={0,1,0,-1};//右下左上
int dy[4]={1,0,-1,0};//右下左上
//BFS 传入迷宫(数组,不同的数值代表空地以及障碍物)传入map,用来标记当前位置的上一个位置在哪里,传入队列,用来放入当前位置的下一步,传入迷宫边界,防止越界
void BFS(vector<vector<int>> &arr,map<pair<int,int>,pair<int,int>> &mp,queue<pair<int, int>> &que,int endx,int endy)
{
    pair<int , int> star={0,0};//首先将起点入队
    que.push(star);
    arr[0][0]=1;//并将其设置为已经访问
    while(!que.empty())//起点不为空时
    {
        for(int i=0;i<4;i++)//判断上下左右的位置是否合法
        {
            int x=que.front().first+dx[i];
            int y=que.front().second+dy[i];
            if(x>=0 && x<endx && y>=0 && y<endy && arr[x][y]!=1)//当前位置如果合法
            {
                que.push({x,y});//将其入队
                arr[x][y]=1;//将其设置为已访问
                mp.insert(pair<pair<int,int>,pair<int,int>> ({x,y},{que.front().first,que.front().second}) );//将当前位置的上一个位置插入map中,便于后续查找
            }
        }
        que.pop();//队首的所有下一个位置都入队后,将队首出队
    }
    //当前循环结束后能够遍历迷宫中所有的位置
}

int main()
{
    int row,col;
    while(cin>>row>>col)
    {
        vector<vector<int>> arr(row,vector<int>(col,0));
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                cin>>arr[i][j];
            }
        }//迷宫已经有了

        map<pair<int,int>,pair<int,int>>mp;//用于存储上一个元素
        queue<pair<int, int>> que;//用来遍历所有位置

        BFS(arr,mp,que,row,col);

        vector<pair<int, int>> ret;//用来保存最终的路径
        pair<int , int> end={row-1,col-1};//设置终点
        ret.push_back(end);//将终点入队
        while(!(end.first==0 && end.second==0))
        {
            for(auto a:mp )//从map中查找终点的上一个位置
            {
                if(a.first==end)//找到后将终点的上一个位置插入路径中
                {
                    ret.push_back(a.second);
                    end=a.second;//更新当前的终点位置
                    break;
                }
            }
        }
        //当前while循环结束后,ret中保存了当前的最短路径,但是是倒序的
        reverse(ret.begin(), ret.end());//逆制ret得到最终结果
        for(auto a:ret)//按要求输出
        {
            cout<<"("<<a.first<<","<<a.second<<")"<<endl;
        }

   }
    return 0;
}
全部评论

相关推荐

威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务