poj2251(Dungeon Master)

题目地址:Dungeon Master

 

题目大意:

    一个三维的图,‘.’代表空白的地方,“#”代表墙无法通过。从“S”地方开始,问你是否能达到“E”点,如果能输出多少时间,如果不能输出“Trapped!”。

 

解题思路:

    搜索BFS。  刚开始vis数组标记的时候出现错误,只是在出队列的时候标记该点的坐标被访问,这样会导致,如果a(x,y,z)点没有出队列的时候,该点的vis情况还是为0,这时候如果有其他的点衍生出来的点还包括a点的话,a点还是会进队列,所以会MTL。  所以正常的标记vis,应该 在进队列的时候标记,这样始终保证队列里的点不会重复进入。

 

代码:

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <sstream>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <cstdio>
  7 #include <string>
  8 #include <bitset>
  9 #include <vector>
 10 #include <queue>
 11 #include <stack>
 12 #include <cmath>
 13 #include <list>
 14 //#include <map>
 15 #include <set>
 16 using namespace std;
 17 
 18 const int d1y[]= {0,-1,0,1};
 19 const int d1z[]= {-1,0,1,0};
 20 const int dx[]= {1,-1};
 21 int l,r,c;
 22 char map[31][31][31];
 23 int b[31][31][31];
 24 int vis[31][31][31];
 25 int ce;
 26 int ei,ej,ek;
 27 int BFS(int x,int y,int z)
 28 {
 29     int i,j;
 30     int xx,yy,zz;
 31     queue<int >Q;
 32     Q.push(x);
 33     Q.push(y);
 34     Q.push(z);
 35     while(!Q.empty())
 36     {
 37         xx=Q.front();
 38         Q.pop();
 39         yy=Q.front();
 40         Q.pop();
 41         zz=Q.front();
 42         Q.pop();
 43       //  vis[xx][yy][zz]=1;
 44         if (xx==ei&&yy==ej&&zz==ek)
 45         {
 46             ce=b[xx][yy][zz];
 47             return 0;
 48         }
 49         for(i=0; i<4; i++)
 50         {
 51             x=xx;
 52             y=yy+d1y[i];
 53             z=zz+d1z[i];
 54             if (map[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c&&!vis[x][y][z])
 55             {
 56                 Q.push(x);
 57                 Q.push(y);
 58                 Q.push(z);
 59                 b[x][y][z]=b[xx][yy][zz]+1;
 60                 vis[x][y][z]=1;
 61             }
 62         }
 63         for(i=0; i<2; i++)
 64         {
 65             x=xx+dx[i];
 66             y=yy;
 67             z=zz;
 68             if (map[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c&&!vis[x][y][z])
 69             {
 70                 Q.push(x);
 71                 Q.push(y);
 72                 Q.push(z);
 73                 b[x][y][z]=b[xx][yy][zz]+1;
 74                 vis[x][y][z]=1;
 75             }
 76         }
 77     }
 78     return 0;
 79 }
 80 int main()
 81 {
 82     while(scanf("%d%d%d",&l,&r,&c)&&(l+r+c))
 83     {
 84         memset(map,0,sizeof(map));
 85         memset(b,0,sizeof(b));
 86         memset(vis,0,sizeof(vis));
 87         int i,j,k;
 88         int si,sj,sk;
 89         getchar();
 90         for(i=0; i<l; i++)
 91         {
 92             for(j=0; j<r; j++)
 93             {
 94                 for(k=0; k<c; k++)
 95                 {
 96                     scanf("%c",&map[i][j][k]);
 97                     if (map[i][j][k]=='S')
 98                     {
 99                         si=i;
100                         sj=j;
101                         sk=k;
102                     }
103                     if (map[i][j][k]=='E')
104                     {
105                         ei=i;
106                         ej=j;
107                         ek=k;
108                     }
109                 }
110                 getchar();
111             }
112             getchar();
113         }
114         ce=0;
115         BFS(si,sj,sk);
116         if (ce)
117             printf("Escaped in %d minute(s).\n",ce);
118         else
119             printf("Trapped!\n");
120     }
121     return 0;
122 }
View Code

 

posted @ 2014-08-04 16:56  kinghold  Views(178)  Comments(0Edit  收藏  举报