标签:span i++ cte level time queue blocks oid empty
题目网址:http://poj.org/problem?id=2251
题目:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 34733 | Accepted: 13268 |
Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
思路:
这道题无非就是将方向数组再增加一个维度——层数。由原来的四个方向,延伸为6个方向,多了上楼和下楼。总而言之就是换汤不换药,直接BFS。要注意的是每次搜索完都要清空一下队列。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 const int INF=111111111; 6 struct node{ 7 int z,x,y; 8 }dir[6]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{-1,0,0},{1,0,0}}; 9 queue<node>q; 10 int l,r,c; 11 int xb,yb,zb,xe,ye,ze; 12 int visited[35][35][35]; 13 int flag; 14 char maze[35][35][35]; 15 bool check(int z,int x,int y){ 16 if(z<0 || z>=l) return false; 17 if(x<0 || x>=r) return false; 18 if(y<0 || y>=c) return false; 19 if(maze[z][x][y]==‘#‘) return false;//这里的判断条件不要写成maze[z][x][y]!=‘.‘,因为还有结束标记‘E‘也是要走的 20 if(visited[z][x][y]) return false;//走过的点无需再走,因为再经过该点时说明耗费的时间已经比之前久了,所以不用考虑 21 return true; 22 } 23 void init(){ 24 memset(visited, 0, sizeof(visited)); 25 flag=0; 26 while (!q.empty()) q.pop();//记住每次清空队列 27 } 28 void bfs(){ 29 node now,next; 30 now.z=zb;now.x=xb;now.y=yb; 31 q.push(now); 32 while (!q.empty()) { 33 now=q.front();q.pop(); 34 if(now.z==ze && now.x==xe && now.y==ye){ 35 flag=1; 36 printf("Escaped in %d minute(s).\n",visited[now.z][now.x][now.y]-1);//因为起点是从1开始标记,所以答案减一 37 break; 38 } 39 for(int d=0;d<6;d++){ 40 next.z=now.z+dir[d].z; 41 next.x=now.x+dir[d].x; 42 next.y=now.y+dir[d].y; 43 if(check(next.z,next.x,next.y)){ 44 visited[next.z][next.x][next.y]=visited[now.z][now.x][now.y]+1; 45 q.push(next); 46 } 47 } 48 } 49 } 50 int main(){ 51 while(scanf("%d%d%d ",&l,&r,&c)!=EOF && (l+r+c)){ 52 init(); 53 for (int i=0; i<l; i++) { 54 for (int j=0; j<r; j++) { 55 gets(maze[i][j]); 56 for(int k=0; k<c; k++){ 57 if(maze[i][j][k]==‘S‘){ 58 zb=i;xb=j;yb=k; 59 } 60 if(maze[i][j][k]==‘E‘){ 61 ze=i;xe=j;ye=k; 62 } 63 } 64 } 65 char str[100]; 66 gets(str); 67 } 68 visited[zb][xb][yb]=1;//起点要先标记走过 69 bfs(); 70 if(!flag) printf("Trapped!\n"); 71 } 72 return 0; 73 }
标签:span i++ cte level time queue blocks oid empty
原文地址:http://www.cnblogs.com/uniles/p/7145124.html