POJ-2251 Dungeon Master(簡單的三維bfs)
阿新 • • 發佈:2019-01-29
#include <iostream> #include<stdio.h> #include<queue> #include<string.h> using namespace std; const int SIZE=35; int l,r,c; char mp[SIZE][SIZE][SIZE]; int step[SIZE][SIZE][SIZE]; int check[SIZE][SIZE][SIZE]; int to[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}}; struct node { int i,j,k; node(int a,int b,int c) { i=a;j=b;k=c; } }; void bfs(int r1,int r2,int r3,int e1,int e2,int e3) { queue<node> q; while(!q.empty()) { q.pop(); } q.push(node(r1,r2,r3)); check[r1][r2][r3]=1; step[r1][r2][r3]=0; while(!q.empty()) { int n1=q.front().i; int n2=q.front().j; int n3=q.front().k; q.pop(); if(n1==e1 && n2==e2 &&n3==e3) break; for(int i=0;i<6;i++) { int new1=n1+to[i][0]; int new2=n2+to[i][1]; int new3=n3+to[i][2]; if(new1>=0 && new1<l &&new2>=0 && new2<r &&new3>=0 && new3<c &&mp[new1][new2][new3]=='.'&&(!check[new1][new2][new3])) { check[new1][new2][new3]=1; step[new1][new2][new3]=step[n1][n2][n3]+1; q.push(node(new1,new2,new3)); } } } } int main() { int r1,r2,r3; int e1,e2,e3; while(cin>>l>>r>>c &&(l||r||c)) { memset(mp,0,sizeof(mp)); memset(step,0,sizeof(step)); memset(check,0,sizeof(check)); for(int i=0;i<l;i++,getchar()) { for(int j=0;j<r;j++,getchar()) { for(int k=0;k<c;k++) { cin>>mp[i][j][k]; if(mp[i][j][k]=='S') { r1=i;r2=j;r3=k; } if(mp[i][j][k]=='E') { e1=i;e2=j;e3=k;mp[i][j][k]='.';//這個地方把最後的E改成.不然最後一步搜不到。 } } } } bfs(r1,r2,r3,e1,e2,e3); if(step[e1][e2][e3]) { printf("Escaped in %d minute(s).\n",step[e1][e2][e3]); } else { puts("Trapped!"); } } return 0; }