胜利大逃亡,三维的广搜,其实就是增加2个方向
1 #include <stdio.h> 2 int a,b,c,t; 3 int map[51][51][51],mark[51][51][51]; 4 int dir[6][3]={{0,1,0},{0,-1,0},{0,0,1},{0,0,-1},{1,0,0},{-1,0,0}}; 5 struct node 6 { 7 int x,y,z; 8 }; 9 node q[1260000]; 10 void bfs() 11 { 12 int front=0,rear=0,u; 13 node p,s; 14 p.x=0;p.y=0;p.z=0; 15 q[rear++]=p; 16 while (front<rear) 17 { 18 p=q[front++]; 19 if(mark[p.z][p.x][p.y]>t) 20 continue; 21 for (int i=0;i<6 ;i++ ) 22 { 23 s.x=p.x+dir[i][1]; 24 s.y=p.y+dir[i][2]; 25 s.z=p.z+dir[i][0]; 26 if(s.x>=0&&s.x<a&&s.y>=0&&s.y<b&&s.z>=0&&s.z<c&&map[s.z][s.x][s.y]==0&& 27 mark[s.z][s.x][s.y]==0&&!(s.x==0&&s.y==0&&s.z==0)) 28 { 29 mark[s.z][s.x][s.y]=mark[p.z][p.x][p.y]+1; 30 q[rear++]=s; 31 } 32 } 33 } 34 } 35 36 int main(int argc, char *argv[]) 37 { 38 int k; 39 scanf("%d",&k); 40 while (k--) 41 { 42 scanf("%d %d %d %d",&c,&a,&b,&t); 43 int i,j,k; 44 for(i=0;i<c;i++) 45 { 46 for(j=0;j<a;j++) 47 for(k=0;k<b;k++) 48 scanf("%d",&map[i][j][k]); 49 } 50 for(i=0;i<c;i++) 51 for(j=0;j<a;j++) 52 for(k=0;k<b;k++) 53 mark[i][j][k]=0; 54 if(a==1&&b==1&&c==1&&map[0][0][0]==0) 55 { 56 printf("0\n"); 57 continue; 58 } 59 if(map[c-1][a-1][b-1]==0) 60 bfs(); 61 if(mark[c-1][a-1][b-1]==0) 62 printf("-1\n"); 63 else 64 printf("%d\n",mark[c-1][a-1][b-1]); 65 } 66 return 0; 67 }