胜利大逃亡

基础bfs   

不能重复的bfs

一次ac

#include<bits/stdc++.h>
using namespace std;

int world[51][51][51];
int d[51][51][51];
int a,b,c,time1;

struct node
{
    int x,y,z;
    node(int x=0,int y=0,int z=0):x(x),y(y),z(z){}
};
void bfs()
{
    memset(d,-1,sizeof(d));
    int dx[6]={0,0,1,-1,0,0};
    int dy[6]={1,0,0,0,-1,0};
    int dz[6]={0,1,0,0,0,-1};
    node u(1,1,1);
    d[1][1][1]=0;
    queue<node>q;
    q.push(u);

    while(!q.empty())
    {
        u=q.front();q.pop();

        if(u.x==a&&u.y==b&&u.z==c&&d[u.x][u.y][u.z]<=time1) {printf("%d
",d[u.x][u.y][u.z]);return;}

        for(int i=0;i<6;i++)
        {  node v(u.x+dx[i],u.y+dy[i],u.z+dz[i]);

           if(v.x>=1&&v.x<=a&&v.y>=1&&v.y<=b&&v.z>=1&&v.z<=c&&world[v.x][v.y][v.z]==0&&d[v.x][v.y][v.z]==-1)
           {

              d[v.x][v.y][v.z]=d[u.x][u.y][u.z]+1;
               q.push(v);
           }
        }
    }
    printf("-1
");


}

int main()
{
    int cas;cin>>cas;
    while(cas--)
    {
        scanf("%d%d%d%d",&a,&b,&c,&time1);
        for(int i=1;i<=a;i++)
            for(int j=1;j<=b;j++)
              for(int s=1;s<=c;s++)
                 scanf("%d",&world[i][j][s]);
        
        bfs();

    }


    return 0;
}
View Code
原文地址:https://www.cnblogs.com/bxd123/p/10303536.html