#include<iostream> #include<cstring> #include<queue> using namespace std; #define MAX 100 #define INF 0x3f3f3f3f typedef pair<int ,int> P; int sx,sy,gx,gy,n,m; char maze[MAX][MAX]; int d[MAX][MAX]; int diraction[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; P ser[MAX][MAX]; int bfs() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { cin>>maze[i][j]; if(maze[i][j]=='S') { sx=i; sy=j; } if(maze[i][j]=='G') { gx=i; gy=j; } } queue<P> que; que.push(P(sx,sy)); memset(d,INF,sizeof(d)); d[sx][sy]=0; while(que.size()) { P p=que.front(); que.pop(); int x=p.first,y=p.second; if(x==gx&&y==gy) break; for(int i=0;i<4;i++) { int cx=x+diraction[i][0],cy=y+diraction[i][1]; if(cx>=0&&cx<n&cy>=0&&cy<m&&d[cx][cy]==INF&&maze[cx][cy]!='#') { que.push(P(cx,cy)); d[cx][cy]=d[x][y]+1; ser[cx][cy].first=x; ser[cx][cy].second=y; } } } return d[gx][gy]; } void print(int x,int y) { if(x==sx&&y==sy) { cout<<'('<<sx<<','<<sy<<')'<<endl; return ; } print(ser[x][y].first,ser[x][y].second); cout<<'('<<x<<','<<y<<')'<<endl; return ; } int main () { cout<<bfs()<<endl; print(gx,gy); return 0; }
样例:
N=10, M=10(迷宫如下图所示。'#','.','S','G'分别表示墙壁、通道、起点和终点)
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出
22(附加坐标)
解析 : 广度优先搜索对树的每一层一次遍历,即筛选最短路径,用队列存储找到的元素(相对于深度优先搜索使用栈),其中可用pair类替换结构体;对于打印路径,因为每个节点的孩子只有一个双亲所以可以用孩子记录双亲依此找到最短路径坐标,对于非递归输出可用栈存储。