胜利大逃亡bfs

//这个题首先要对应好关系,题目中是竖着放的,而我们输入的时候是横着的,所以z对应a,x对应b,y对应c

#include <iostream>

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int a,b,c,t;
int s[55][55][55];
int biao[55][55][55];
int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};//六种情况
struct node
{
    int x,y,z;
};
void bfs(int q,int w,int e)
{
    memset(biao,0,sizeof(biao));
    queue<node>p;
    node o;
    o.x=q;
    o.y=w;
    o.z=e;
    p.push(o);
    biao[q][w][e]=1;//这个数组有两个意思,一个是标记,另一个是记时间。
    while(!p.empty())
    {
        o=p.front();
        p.pop();
            for(int i=0;i<6;i++)
            {
                node f;
                f.x=o.x+dis[i][0];
                f.y=o.y+dis[i][1];
                f.z=o.z+dis[i][2];
                if(f.x<0||f.y<0||f.z<0||f.x>=b||f.y>=c||f.z>=a||s[f.z][f.x][f.y]||biao[f.x][f.y][f.z])//当满足出界,标记不为0,路为1的时候,就continue
                    continue;
                p.push(f);
                biao[f.x][f.y][f.z]=biao[o.x][o.y][o.z]+1;
            }
    }
}
int main()
{
    int i,j,k,r;
    scanf("%d",&r);
    while(r--)
    {
        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",&s[i][j][k]);
        bfs(0,0,0);
        if(biao[b-1][c-1][a-1]>t)
            printf("-1\n");
        else
            printf("%d\n",biao[b-1][c-1][a-1]-1);//因为一开始标记了这个数组为1,所以最后输出时要减去1
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值