PKU 3964 无向图广度遍历

题意:已经一个5*5的二维数组,共中0代表可通过,1代表不可。求(0,0)到(4,4)即对角线的最短路,只允许上下左右走。

分析:因为求最短路径,所以是BFS不可DFS。关键在于如何记录走过路径,路径队列每次加入新节点务必记录它的前驱节点,遍历结束后从终点依照前驱节一直找到源点求最短路径(由源点向终点可能多解,需要处理),然后用辅助栈反序。

 

C/C++源码:

#include <iostream> #include <cstring> #include <vector> #include <stack> #include <queue> using namespace std; const int N = 5; struct offset{ int x,y; } d[]={{0,1},{0,-1},{-1,0},{1,0}}; const int d_num = sizeof(d)/sizeof(offset); bool f[N][N]; bool maze[N][N]; struct node{ node(int a,int b,int c=0,int d=0):x(a),y(b),prex(c),prey(d){} int x,y; int prex,prey; }; bool isOK(int x, int y){ return (!f[x][y] && !maze[x][y] && x>=0 && x<=4 && y>=0 && y<=4); } /*find the shortest path from start point(0,0) to finish point(N-1,N-1)*/ int main() { queue<node*> q; vector<node*> q1; int sx,sy,fx,fy; sx=sy=0;//set the start point fx=fy=N-1;//set the finish point q.push(new node(sx,sy,-1,-1)); memset(f,false,sizeof(f)); f[sx][sy]=true; for(int i=0;i<N;i++) for(int j=0;j<N;j++) cin >> maze[i][j]; while(!q.empty()){ int x,y; x = q.front()->x; y = q.front()->y; q1.push_back(q.front());//record the path if(x==fx && y==fy)break;//may be sx==fx && sy==fy q.pop(); for(int i=0;i<d_num;i++){ int new_x=x+d[i].x; int new_y=y+d[i].y; if(isOK(new_x, new_y)){ q.push(new node(new_x, new_y,x,y)); f[new_x][new_y]=true; } } } //print the path if(!q1.empty() && q1[q1.size()-1]->x==fx && q1[q1.size()-1]->y==fy){ stack<node*> s; int curX = fx, curY = fy; while(!(curX==sx && curY==sy)){ s.push(new node(curX,curY)); for(vector<node*>::iterator it=q1.begin();it!=q1.end();it++){ if((*it)->x==curX && (*it)->y==curY){ curX = (*it)->prex; curY = (*it)->prey; break; } } } s.push(new node(curX,curY)); while(!s.empty()){ cout << “(” << s.top()->x << “, ” << s.top()->y <<“)” << endl; delete s.top(); s.pop(); } }else{ cout << “No Way!” << endl; } return 0; }

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/koala002/article/details/6415638
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞