杭电“胜利大逃亡”英文版,三维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;
}