POJ 2251 Dungeon Master

  毫无意义的三维BFS.....

  从 S 出发 每次可以选择六个方向 求到 E 的最小移动次数 。

  

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <queue>
  7 
  8 using namespace std;
  9 
 10 char maze[31][31][31];
 11 bool MarkMaze[31][31][31];
 12 
 13 struct P
 14 {
 15     int l,r,c,step;
 16 }sp,ep,tp,np;
 17 
 18 int L,R,C,len;
 19 
 20 int jl[] = { 0, 0, 0, 0, 1,-1};
 21 int jr[] = {-1, 0, 1, 0, 0, 0};
 22 int jc[] = { 0,-1, 0, 1, 0, 0};
 23 
 24 void bfs()
 25 {
 26     queue<P> q;
 27     sp.step = 0;
 28     q.push(sp);
 29 
 30     while(q.empty() == false)
 31     {
 32         tp = q.front();
 33         q.pop();
 34 
 35         if(tp.l == ep.l && tp.c == ep.c && tp.r == ep.r)
 36         {
 37             len = tp.step;
 38             return ;
 39         }
 40 
 41         for(int i = 0;i < 6; ++i)
 42         {
 43             np.c = tp.c + jc[i];
 44             np.l = tp.l + jl[i];
 45             np.r = tp.r + jr[i];
 46             np.step = tp.step + 1;
 47             if(np.c >= 1 && np.c <= C && np.l >= 1 && np.l <= L && np.r >= 1 && np.r <= R && maze[np.l][np.r][np.c] != '#' && MarkMaze[np.l][np.r][np.c] == false)
 48             {
 49                 MarkMaze[np.l][np.r][np.c] = true;
 50                 q.push(np);
 51             }
 52         }
 53     }
 54 }
 55 
 56 int main()
 57 {
 58     int i,j,k;
 59 
 60     while(scanf("%d %d %d",&L,&R,&C) && (L || R || C))
 61     {
 62         len = -1;
 63 
 64         memset(MarkMaze,false,sizeof(MarkMaze));
 65 
 66         for(i = 1;i <= L; ++i)
 67         {
 68             for(j = 1;j <= R; ++j)
 69             {
 70                 scanf("%s",maze[i][j]+1);
 71             }
 72             getchar();
 73         }
 74 
 75         for(i = 1;i <= L; ++i)
 76         {
 77             for(j = 1;j <= R; ++j)
 78             {
 79                 for(k = 1;k <= C; ++k)
 80                 {
 81                     if(maze[i][j][k] == 'S')
 82                     {
 83                         sp.l = i;
 84                         sp.r = j;
 85                         sp.c = k;
 86                     }
 87                     else if(maze[i][j][k] == 'E')
 88                     {
 89                         ep.l = i;
 90                         ep.r = j;
 91                         ep.c = k;
 92                     }
 93                 }
 94             }
 95         }
 96 
 97         bfs();
 98 
 99         if(len == -1)
100             printf("Trapped!\n");
101         else
102             printf("Escaped in %d minute(s).\n",len);
103     }
104 }

 

你可能感兴趣的:(POJ 2251 Dungeon Master)