题目大意:
从三维空间的(0,0,0)出发到(a-1,b-1,c-1),每移动一个都要时间加一,计算最短时间
根据六个方向,开个bfs,像spfa那样计算最短路径就行了,但是要1200多ms,也不知道有没有更好的方法
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 using namespace std; 6 int dp[52][52][52] , a , b , c; 7 bool wall[52][52][52] , vis[52][52][52]; 8 int dir[6][3] = {{0,0,1} , {0,1,0} , {1,0,0} , {0,0,-1} , {0,-1,0} , {-1,0,0}}; 9 struct Node{ 10 int x , y , z; 11 Node(int x = 0 , int y = 0 , int z = 0):x(x),y(y),z(z){} 12 }; 13 queue<Node> q; 14 15 bool ok(int x , int y , int z) 16 { 17 if(x<0 || x>=a) return false; 18 if(y<0 || y>=b) return false; 19 if(z<0 || z>=c) return false; 20 if(wall[x][y][z]) return false; 21 return true; 22 } 23 24 int main() 25 { 26 // freopen("a.in" , "r" , stdin); 27 int T , t , w; 28 scanf("%d" , &T); 29 while(T--){ 30 scanf("%d%d%d%d" , &a , &b , &c , &t); 31 for(int i = 0 ; i<a ; i++) 32 for(int j = 0 ; j<b ; j++) 33 for(int k = 0 ; k<c ; k++){ 34 scanf("%d" , &w); 35 if(w) wall[i][j][k] = true; 36 else wall[i][j][k] = false; 37 } 38 memset(dp , 0x3f , sizeof(dp)); 39 memset(vis , 0 , sizeof(vis)); 40 dp[0][0][0] = 0; 41 q.push(Node(0,0,0)); 42 while(!q.empty()){ 43 Node u = q.front(); 44 q.pop(); 45 vis[u.x][u.y][u.z] = false; 46 for(int i = 0 ; i<6 ; i++){ 47 Node v; 48 v.x = u.x+dir[i][0]; 49 v.y = u.y+dir[i][1]; 50 v.z = u.z+dir[i][2]; 51 if(ok(v.x,v.y,v.z)){ 52 if(dp[v.x][v.y][v.z] > dp[u.x][u.y][u.z] + 1){ 53 dp[v.x][v.y][v.z] = dp[u.x][u.y][u.z] + 1; 54 if(!vis[v.x][v.y][v.z]){ 55 q.push(v); 56 vis[v.x][v.y][v.z] = true; 57 } 58 } 59 } 60 } 61 } 62 63 if(dp[a-1][b-1][c-1] > t) puts("-1"); 64 else printf("%d\n" , dp[a-1][b-1][c-1]); 65 } 66 return 0; 67 }
时间: 2024-10-20 12:06:16