题解 | #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;
}
全部评论

相关推荐

头像 会员标识
昨天 17:08
已编辑
牛客_产品运营部_私域运营
腾讯 普通offer 24k~26k * 15,年包在36w~39w左右。
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务