poj 1253 三维数组+广搜+减枝
来源:互联网 发布:js移动端手指滑动切换 编辑:程序博客网 时间:2024/04/30 03:30
#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using namespace std;const int N=51;int A,B,C,step;int map[N][N][N];int visited[N][N][N];int ds[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,-1},{0,0,1}}; struct Cube{ int x; int y; int z; int step;}cube[N*N*N];void bfs(){ int x,y,z,sp; queue<Cube> qu; Cube cub,next; cub.x=0; cub.y=0; cub.z=0; cub.step=0; if(A==1&&B==1&&C==1) { printf("0\n"); return ; } qu.push(cub); visited[0][0][0]=1; while(!qu.empty()) { Cube cc=qu.front(); qu.pop(); for(int i=0;i<6;i++) { next.x=x=cc.x+ds[i][0]; next.y=y=cc.y+ds[i][1]; next.z=z=cc.z+ds[i][2]; next.step=sp=cc.step+1; if(sp>step) continue; if(x>=0&&x<A&&y>=0&&y<B&&z>=0&&z<C&&map[x][y][z]==0&&visited[x][y][z]==0) { if(x==A-1&&y==B-1&&z==C-1) { printf("%d\n",sp); return ; } qu.push(next); visited[x][y][z]=1; } } } //system("pause"); printf("-1\n"); }int main(){ int T; scanf("%d",&T); while(T--) { memset(map,0,sizeof(map)); memset(visited,0,sizeof(visited)); scanf("%d%d%d%d",&A,&B,&C,&step); for(int i=0;i<A;i++) for(int j=0;j<B;j++) for(int k=0;k<C;k++) scanf("%d",&map[i][j][k]); if(A+B+C-3>step) { printf("-1\n"); continue; } bfs(); } system("pause"); return 0;}