码迷,mamicode.com
首页 > 其他好文 > 详细

专题一 简单搜索 Problem B

时间:2015-07-13 06:28:22      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://poj.org/problem?id=2251

题目大意:三维迷宫求两点间最短路。

解题思路:bfs搜索。

     用一个三维数组maze记录迷宫的每一点是否可走。

     用一个三维数组标记每一点是否已经走过。

     用一个一维数组模拟队列的实现过程。

     将起点放在队首,然后向六个方向扩展,若可行,则把该点放在队首,并抛弃队首成员。

     如果当前点为终点,则记录下此时花费的时间,并返回。

代码如下:

技术分享
  1 #include<cstdio>
  2 #include<cstring>
  3 #define MAXN 35
  4 
  5 bool maze[MAXN][MAXN][MAXN];//记录该点是否可走
  6 bool vis [MAXN][MAXN][MAXN];//记录该点是否已经走过
  7 int l,r,c,res;
  8 struct Point//描述一个点
  9 {
 10     int l,r,c,cost;
 11 };
 12 Point s,e;//起点和终点
 13 Point Queue[MAXN*MAXN*MAXN];//模拟队列的实现
 14 
 15 bool bfs(int l,int r,int c)
 16 {
 17     memset(vis,0,sizeof(vis));//初始化,全部未走过
 18 
 19     int head=0,tail=1;//队首,队尾
 20 
 21     //描述队首
 22     Queue[0].l=l;
 23     Queue[0].r=r;
 24     Queue[0].c=c;
 25     Queue[0].cost=0;
 26     vis[l][r][c]=true;//已经走过了该点
 27 
 28     while(head<tail)
 29     {
 30         Point x=Queue[head++];//从队首拿出一点
 31 
 32         if(x.l==e.l && x.r==e.r && x.c==e.c)//如果该点是终点,结束搜索
 33         {
 34             res=x.cost;
 35             return true;
 36         }
 37 
 38         if(maze[x.l][x.r][x.c-1]==1 && vis[x.l][x.r][x.c-1]==0)//向西扩展
 39         {
 40             vis[x.l][x.r][x.c-1]=true;
 41             Queue[tail].l=x.l;
 42             Queue[tail].r=x.r;
 43             Queue[tail].c=x.c-1;
 44             Queue[tail++].cost=x.cost+1;
 45         }
 46         if(maze[x.l][x.r][x.c+1]==1 && vis[x.l][x.r][x.c+1]==0)//向东扩展
 47         {
 48             vis[x.l][x.r][x.c+1]=true;
 49             Queue[tail].l=x.l;
 50             Queue[tail].r=x.r;
 51             Queue[tail].c=x.c+1;
 52             Queue[tail++].cost=x.cost+1;
 53         }
 54         if(maze[x.l][x.r-1][x.c]==1 && vis[x.l][x.r-1][x.c]==0)//向北扩展
 55         {
 56             vis[x.l][x.r-1][x.c]=true;
 57             Queue[tail].l=x.l;
 58             Queue[tail].r=x.r-1;
 59             Queue[tail].c=x.c;
 60             Queue[tail++].cost=x.cost+1;
 61         }
 62         if(maze[x.l][x.r+1][x.c]==1 && vis[x.l][x.r+1][x.c]==0)//向南扩展
 63         {
 64             vis[x.l][x.r+1][x.c]=true;
 65             Queue[tail].l=x.l;
 66             Queue[tail].r=x.r+1;
 67             Queue[tail].c=x.c;
 68             Queue[tail++].cost=x.cost+1;
 69         }
 70         if(maze[x.l-1][x.r][x.c]==1 && vis[x.l-1][x.r][x.c]==0)//向下扩展
 71         {
 72             vis[x.l-1][x.r][x.c]=true;
 73             Queue[tail].l=x.l-1;
 74             Queue[tail].r=x.r;
 75             Queue[tail].c=x.c;
 76             Queue[tail++].cost=x.cost+1;
 77         }
 78         if(maze[x.l+1][x.r][x.c]==1 && vis[x.l+1][x.r][x.c]==0)//向上扩展
 79         {
 80             vis[x.l+1][x.r][x.c]=true;
 81             Queue[tail].l=x.l+1;
 82             Queue[tail].r=x.r;
 83             Queue[tail].c=x.c;
 84             Queue[tail++].cost=x.cost+1;
 85         }
 86     }
 87     return false;
 88 }
 89 
 90 int main()
 91 {
 92     while(scanf("%d %d %d",&l,&r,&c)!=EOF)
 93     {
 94         getchar();
 95         if(l==0 && r==0 && c==0) break;
 96 
 97         memset(maze,0,sizeof(maze));//初始化迷宫,认为每点都是不可走的
 98         for(int k=0;k<l;k++)
 99         {
100             for(int i=0;i<r;i++)
101             {
102                 for(int j=0;j<c;j++)
103                 {
104                     char temp;
105                     scanf("%c",&temp);
106                     if(temp==S)
107                     {
108                         s.l=k;
109                         s.r=i;
110                         s.c=j;
111                         maze[k][i][j]=true;
112                     }
113                     else if(temp==E)
114                     {
115                         e.l=k;
116                         e.r=i;
117                         e.c=j;
118                         maze[k][i][j]=true;
119                     }
120                     else if(temp==.)
121                     {
122                         maze[k][i][j]=true;
123                     }
124                 }
125                 getchar();
126             }
127             getchar();
128         }
129 
130         if(bfs(s.l,s.r,s.c)==true)
131             printf("Escaped in %d minute(s).\n",res);
132         else
133             printf("Trapped!\n");
134     }
135     return 0;
136 }
View Code

 

专题一 简单搜索 Problem B

标签:

原文地址:http://www.cnblogs.com/Page3/p/4641881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!