poj 2251 Dungeon Master (三维bfs)

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

简单bfs,只不过是三维的。。。

唯一的坑点在输出上...

Escaped in %d minute(s)

这意思是答案为1输出minute,不为1输出minutes还是说是不是1都输出minute(s)? 试了下,答案是后者。

另:终于找到了好的读地图的方法。。。而不用担心回车符。

就是先读成字符串。

具体见代码

  1
  2   
  3   /*************************************************************************
  4   	> File Name: code/2015summer/searching/B.cpp
  5   	> Author: 111qqz
  6   	> Email: rkz2013@126.com 
  7   	> Created Time: 2015年07月17日 星期五 16时47分46秒
  8    ************************************************************************/
  9   
 10   #include<iostream>
 11   #include<iomanip>
 12   #include<cstdio>
 13   #include<algorithm>
 14   #include<cmath>
 15   #include<cstring>
 16   #include<string>
 17   #include<map>
 18   #include<set>
 19   #include<queue>
 20   #include<vector>
 21   #include<stack>
 22   using namespace std;
 23   #define REP(i, n) for (int i=0;i<int(n);++i)  
 24   typedef long long LL;
 25   typedef unsigned long long ULL;
 26   const int N=40;
 27   char st[N][N][N];
 28   int d[N][N][N];
 29   int l,r,c;
 30   int sx,sy,sz,tx,ty,tz;
 31   int dirx[6]={1,-1,0,0,0,0};
 32   int diry[6]={0,0,-1,1,0,0};
 33   int dirz[6]={0,0,0,0,1,-1};
 34   
 35   bool ok(int x,int y,int z)
 36   {
 37       if (z>=0&&z<l&&x>=0&&x<r&&y>=0&&y<c&&d[z][x][y]==-1&&st[z][x][y]!='#')
 38   	  return true;
 39       return false;
 40   }
 41   
 42   void bfs()
 43   {
 44       memset(d,-1,sizeof(d));
 45       queue<int>x;
 46       queue<int>y;
 47       queue<int>z;
 48       x.push(sx);
 49       y.push(sy);
 50       z.push(sz);
 51       d[sz][sx][sy]=0;
 52       while (!x.empty()&&!y.empty()&&!z.empty())
 53       {
 54   	  int prex = x.front();x.pop();
 55   	  int prey = y.front();y.pop();
 56   	  int prez = z.front();z.pop();
 57   	  for ( int  i = 0 ; i < 6 ; i++ )
 58   	  {
 59   		int newx = prex+dirx[i];
 60   		int newy = prey+diry[i];
 61   		int newz = prez+dirz[i];
 62   		bool flag = ok(newx,newy,newz);
 63   		if (flag)
 64   		{
 65   		    d[newz][newx][newy]=d[prez][prex][prey]+1;
 66   		    x.push(newx);
 67   		    y.push(newy);
 68   		    z.push(newz);
 69   		}
 70   	  }
 71   
 72       }
 73   }
 74   
 75   int main()
 76   {
 77       while (scanf("%d %d %d",&l,&r,&c))
 78       {
 79   	  if (l==0&&r==0&&c==0)
 80   		break;
 81   	  for ( int i = 0 ; i < l ; i++)
 82   	  {
 83   		for ( int j = 0 ; j < r; j++)
 84   		    scanf("%s",st[i][j]);
 85   	  }
 86   	  for ( int i = 0 ; i < l ; i++ )
 87   	  {
 88   		for ( int j = 0 ; j < r ; j ++)
 89   		{
 90   		    for ( int k =  0 ;  k < c ; k++ )
 91   		    {
 92   			  if (st[i][j][k]=='S')
 93   			  {
 94   				sx = j;
 95   				sy = k;
 96   				sz = i;
 97   			  }
 98   			  if (st[i][j][k]=='E')
 99   			  {
100   				tx = j;
101   				ty = k;
102   				tz = i;
103   			  }
104   				    
105   		    }
106   		}
107   	  }
108   	  bfs();
109   	  int ans = d[tz][tx][ty];
110   	  if (ans==-1)
111   	  {
112   		printf("Trapped!\n");
113   	  }
114   	  else
115   	  {
116   	//	if (ans==1)
117   	//	printf("Escaped in 1 minute.\n");
118   	//	else printf("Escaped in %d minutes.\n",ans);
119   		printf("Escaped in %d minute(s).\n",ans);
120   	  }
121   
122       }
123   }
124