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;}                                                                                                                                                                                                                                                                                                                                                                                  

原创粉丝点击