标签: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; }
标签:max sed abs alt open event style namespace hid
原文地址:https://www.cnblogs.com/lin1874/p/12203606.html