标签:
题意:
Ignatius要从迷宫的(1,1,1)在时间t内跑到(a,b,c),问可不可能。
(题目本来是从(0,0,0)跑到(a-1,b-1,c-1)的)
简单的3维bfs
加剪枝: a+b+c-3>t 速度会快不少。
不过我这里没有加。
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 const int maxn=53; 6 int a,b,c,t; 7 int dx[6]={0,0,0,0,1,-1}; 8 int dy[6]={0,0,1,-1,0,0}; 9 int dz[6]={1,-1,0,0,0,0}; 10 int maze[maxn][maxn][maxn]; 11 bool vis[maxn][maxn][maxn]; 12 struct Point 13 { 14 int x,y,z,time; 15 }; 16 int bfs() 17 { 18 memset(vis,false,sizeof(vis)); 19 Point s; 20 s.x=s.y=s.z=1; 21 s.time=0; 22 //if(maze[1][1][1]) 23 // return -1; 24 queue<Point>que; 25 while(!que.empty()) 26 que.pop(); 27 que.push(s); 28 vis[1][1][1]=true; 29 while(!que.empty()) 30 { 31 Point u=que.front(); 32 que.pop(); 33 if(u.x==a&&u.y==b&&u.z==c&&u.time<=t) 34 return u.time; 35 if(u.time>=t) 36 continue; 37 for(int i=0;i<6;i++) 38 { 39 Point du; 40 du.x=u.x+dx[i]; 41 du.y=u.y+dy[i]; 42 du.z=u.z+dz[i]; 43 du.time=u.time+1; 44 if(du.x<1||du.x>a||du.y<1||du.y>b||du.z<1||du.z>c) 45 continue; 46 if(maze[du.x][du.y][du.z]) 47 continue; 48 if(vis[du.x][du.y][du.z]) 49 continue; 50 que.push(du); 51 vis[du.x][du.y][du.z]=true; 52 } 53 } 54 return -1; 55 } 56 int main() 57 { 58 int test; 59 scanf("%d",&test); 60 while(test--) 61 { 62 scanf("%d%d%d%d",&a,&b,&c,&t); 63 for(int i=1;i<=a;i++) 64 for(int j=1;j<=b;j++) 65 for(int k=1;k<=c;k++) 66 scanf("%d",&maze[i][j][k]); 67 int ans; 68 if(maze[a][b][c]) 69 ans=-1; 70 else 71 ans=bfs(); 72 printf("%d\n",ans); 73 } 74 return 0; 75 }
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4394101.html