您的位置:首页 > 其它

CDOJ 方老师与迷宫

2014-05-17 16:39 609 查看
二维变三维了。

#include<stdio.h>
#include<string.h>

typedef struct point
{
int x,y,z;
}point;
point in,out,que[30000];
int L,R,C;
int dx[]={0,0,0,0,-1,1};
int dy[]={0,0,-1,1,0,0};
int dz[]={-1,1,0,0,0,0};
char box[31][31][31];
int vis[31][31][31],dis[30000]={0};
bool is_in(int x,int y,int z)
{
if(x>=0&&x<L&&y>=0&&y<R&&z>=0&&z<C)
return true;
else return false;
}
int bfs()
{ int fron=1,rear=1,ans=0;
que[rear].x=in.x,que[rear].y=in.y,que[rear].z=in.z;
rear++;
while(fron<rear)
{
point now;
int i;
now.x=que[fron].x,now.y=que[fron].y,now.z=que[fron].z;
if(now.x==out.x&&now.y==out.y&&now.z==out.z) return fron;
for(i=0;i<6;i++)
{
point tmp;
tmp.x=now.x+dx[i],tmp.y=now.y+dy[i],tmp.z=now.z+dz[i];//扩张出的新一层节点
if(!is_in(tmp.x,tmp.y,tmp.z)) continue;
if(!vis[tmp.x][tmp.y][tmp.z]&&box[tmp.x][tmp.y][tmp.z]!='#')//满足条件则入队
{
vis[tmp.x][tmp.y][tmp.z]=1;
dis[rear]=dis[fron]+1;
que[rear].x=tmp.x,que[rear].y=tmp.y,que[rear].z=tmp.z;
rear++;
}
}
fron++;
}
return 0;
}
int main()
{
while(scanf("%d%d%d",&L,&R,&C)!=EOF)
{
if(L==0) break;
int i,j,k;
char s[31];
memset(vis,0,sizeof(vis));
for(i=0;i<L;i++)
for(j=0;j<R;j++)
{
scanf("%s",s);
for(k=0;k<C;k++)
{ char ch=s[k];
box[i][j][k]=ch;
if(ch=='S') {in.x=i;in.y=j;in.z=k;vis[i][j][k]=1;}
if(ch=='E') {out.x=i;out.y=j;out.z=k;}
}
}
int ans=bfs();
if(ans==0) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",dis[ans]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索 算法 bfs 三维