CDOJ 方老师与迷宫

二维变三维了。

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值