码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1253

时间:2020-01-16 23:55:37      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:max   sed   abs   alt   open   event   style   namespace   hid   

三维迷宫

bfs+剪枝

技术图片
#include <bits/stdc++.h>
using namespace std;
const int MAXN=55;
int g[MAXN][MAXN][MAXN];
int a,b,c,n;
int dx[6]={0,0,1,-1,0,0};
int dy[6]={1,-1,0,0,0,0};
int dz[6]={0,0,0,0,1,-1};
struct node{
    int x,y,z,c;
};
queue<node>que;
bool vis[MAXN][MAXN][MAXN];
int bfs(){
    node aa;
    aa.x=0,aa.y=0;aa.z=0;aa.c=0;
    while(!que.empty())que.pop();
    que.push(aa);
    while(!que.empty()){
        aa=que.front();que.pop();
        if((aa.x==a-1)&&(aa.y==b-1)&&(aa.z==c-1)){
            if(aa.c>=n)return -1;
            else return aa.c;
        }
        if(vis[aa.x][aa.y][aa.z])continue;
        vis[aa.x][aa.y][aa.z]=true;
        for(int i=0;i<6;i++){
            int nx=dx[i]+aa.x;
            int ny=dy[i]+aa.y;
            int nz=dz[i]+aa.z;
            if(nx<0||ny<0||nz<0||nx>=a||ny>=b||nz>=c)continue;
            if(g[nx][ny][nz]==1)continue;
            node tt;
            tt.x=nx;tt.y=ny;tt.z=nz;tt.c=aa.c+1;
            if(abs(a-1-nx)+abs(b-1-ny)+abs(c-1-nz)>(n-tt.c))continue;//剪枝
            que.push(tt);
        }
    }
    return -1;

}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d",&a,&b,&c,&n);
        for(int i=0;i<a;i++){
            for(int j=0;j<b;j++){
                for(int k=0;k<c;k++){
                    scanf("%d",&g[i][j][k]);
                    vis[i][j][k]=false;
                }
            }
        }
        printf("%d\n",bfs());

    }

    return 0;
}
View Code

HDU1253

标签:max   sed   abs   alt   open   event   style   namespace   hid   

原文地址:https://www.cnblogs.com/lin1874/p/12203606.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!