题解 | #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; }