ACM团队2014BFS-(1)城堡逃亡

#include<stdio.h>
struct note
{
    int x;//横
    int y;//纵
    int z;//竖直
    int s;
}que[130000];
int a[51][51][51];
int next[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//表示方向的数组
int main()
{
    int head,tail;
    int flag;
    int i,j,k;
    int A,B,C,T,tx,ty,tz;
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d",&A,&B,&C,&T);
        for(i=0;i<A;i++)
            for(j=0;j<B;j++)
               for(k=0;k<C;k++)
                   scanf("%d",&a[i][j][k]);
        if(A==1&&B==1&&C==1)//出口是(A-1,B-1,C-1)
            printf("0\n");
        else
        {
            head=tail=0;//初始化
            que[head].x=que[head].y=que[head].z=que[head].s=0;               //起始坐标
            tail++;
            a[0][0][0]=1;
            flag=0;                      //用来标记是否到达目标点,0表示暂时还没有达到,1表示达到
            while(head<tail)               //当不为空时循环
            {
                if(que[head].s==T)
                    break;
                if(A+B+C-3>T)
                    break;

                for(j=0;j<=5;j++)       //六个方向

                    //尝试下一个点的坐标

                {
                    tx=que[head].x+next[j][0];
                    ty=que[head].y+next[j][1];
                    tz=que[head].z+next[j][2];
                    if(tx<0||tx>A-1||ty<0||ty>B-1||tz<0||tz>C-1)                     //判断是否越界
                         continue;
                    if(a[tx][ty][tz]==0)

                    {

                      //插入新的点

                       que[tail].x=tx;
                       que[tail].y=ty;
                       que[tail].z=tz;
                       que[tail].s=que[head].s+1;                       //时间加1
                       tail++;
                    }
                    if(tx==A-1&&ty==B-1&&tz==C-1&&a[tx][ty][tz]==0)                    //到达目标,停止扩展
                    {
                        flag=1;
                        break;
                    }
                    a[tx][ty][tz]=1;
                }
                    if(flag==1)
                        break;
                    head++;//当一个点结束扩展后,才嫩对后面的点扩展
            }
            if(flag==1)
                printf("%d\n",que[tail-1].s);
            else
                printf("-1\n");
        }
    }
    getchar();getchar();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值