POJ 2251 Dungeon Master
杭电“胜利大逃亡”英文版,三维BFS,水水的。
不过注意细节,还是要注意细节!!!
数组开大点,不要给他们省内存,开30*30*30的会RE;
下面是代码:
#include <stdio.h> #include <string.h> #include <queue> using namespace std; struct node { int x,y,z,cut; bool operator > (const node &a) const { return cut > a.cut; } }di[6]={ -1,0,0,0, 1,0,0,0, 0,-1,0,0, 0,1,0,0, 0,0,-1,0, 0,0,1,0}; int map1[35][35][35],l,r,c; int main() { while(scanf("%d%d%d",&l,&r,&c),l||r||c) { char s[40]; memset(map1,0,sizeof(map1)); priority_queue <struct node ,vector <struct node>,greater<struct node> >q; struct node du,dc; int i,j,k,flat; for(i=1; i<=l; i++) { for(j=1; j<=r; j++) { scanf("%s",s); for(k=1; k<=c; k++) { if(s[k-1]=='.') { map1[i][j][k]=1; } else if(s[k-1]=='E') { map1[i][j][k]=2; } else if(s[k-1]=='S') { du.x=i; du.y=j; du.z=k; du.cut=0; q.push(du); } } } } flat=0; while(!q.empty()) { du=q.top(); q.pop(); for(i=0;i<6;i++) { if(map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]==1) { dc.x=du.x+di[i].x; dc.y=du.y+di[i].y; dc.z=du.z+di[i].z; dc.cut=du.cut+1; map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]=0; q.push(dc); } else if(map1[du.x+di[i].x][du.y+di[i].y][du.z+di[i].z]==2) { dc.x=du.x; dc.y=du.y; dc.z=du.z; dc.cut=du.cut; flat=1; break; } } if(flat) { break; } } if(flat) { printf("Escaped in %d minute(s).\n",dc.cut+1); } else { printf("Trapped!\n"); } } return 0; }