迷宫问题:BFS

原文地址:http://blog.csdn.net/u013480600/article/details/25486071

POJ 3984 迷宫问题(BFS:迷宫最短路径且输出路径)

http://poj.org/problem?id=3984

题意:

定义一个二维数组: 

int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

分析:

        典型的BFS应用,要你求从左上角到右下角的最短路径,且保证有唯一解,且要输出路径.

        直接BFS求解即可,需要用到vis数组和dist数组,用pre数组来保存当前节点的最短路径上的前一个点(或方向也行).

        其实也可以不用pre数组的,可以直接倒推出最短路径.

AC代码:

[cpp] 
view plain
 copy

  1. #include<cstdio>  
  2. #include<cstring>  
  3. #include<algorithm>  
  4. #include<queue>  
  5. #include<stack>  
  6. using namespace std;  
  7. int maze[10][10];  
  8. int vis[10][10],dist[10][10];  
  9. int dr[]={-1,1,0,0};//上,下,左,右  
  10. int dc[]={0,0,-1,1};  
  11. struct Node  
  12. {  
  13.     int r,c;//也可以在Node中加一个int pre属性,然后做一个全局的nodes,就不用pre[][]数组了.  
  14.     Node(int r,int c):r(r),c(c){}  
  15.     Node(){}  
  16. }pre[10][10];  
  17. queue<Node> Q;  
  18. void BFS()  
  19. {  
  20.     while(!Q.empty()) Q.pop();  
  21.     memset(vis,0,sizeof(vis));  
  22.     dist[0][0]=0;  
  23.     vis[0][0]=1;  
  24.     Q.push(Node(0,0));  
  25.     while(!Q.empty())  
  26.     {  
  27.         Node node=Q.front();Q.pop();  
  28.         int r=node.r,c=node.c;  
  29.         for(int d=0;d<4;d++)  
  30.         {  
  31.             int nr=r+dr[d];  
  32.             int nc=c+dc[d];  
  33.             if(nr>=0&&nr<5&&nc>=0&&nc<5&&vis[nr][nc]==0&&maze[nr][nc]==0)  
  34.             {  
  35.                 vis[nr][nc]=1;  
  36.                 Q.push(Node(nr,nc));  
  37.                 dist[nr][nc]=1+dist[r][c];  
  38.                 pre[nr][nc]=Node(r,c);  
  39.                 if(nr==4&&nc==4) return ;  
  40.             }  
  41.         }  
  42.     }  
  43. }  
  44. int main()  
  45. {  
  46.     for(int i=0;i<5;i++)  
  47.         for(int j=0;j<5;j++)  
  48.             scanf(“%d”,&maze[i][j]);  
  49.     BFS();  
  50.     stack<Node> S;  
  51.     int cur_r=4,cur_c=4;  
  52.     while(true)  
  53.     {  
  54.         S.push(Node(cur_r,cur_c));  
  55.         if(cur_r==0&&cur_c==0) break;  
  56.         int r=cur_r,c=cur_c;  
  57.         cur_r=pre[r][c].r;  
  58.         cur_c=pre[r][c].c;  
  59.     }  
  60.     while(!S.empty())  
  61.     {  
  62.         Node node=S.top(); S.pop();  
  63.         printf(“(%d, %d)\n”,node.r,node.c);  
  64.     }  
  65.     return 0;  
  66. }  
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/patkritLee/article/details/52687824
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞