题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1253
题目大意:
有一个三维立体的立方体迷宫,开始的位置为(0,0,0),离开的位置为(A-1,B-1,C-1),迷宫中0表示
路,1表示墙,你只能从一个坐标走到相邻的六个坐标其中的一个。问:离开这个迷宫的最短时间
是多少。
思路:
可以很容易的想到BFS找到最短的路径。只不过是三维的,用个二维数组存放六个方向。用队列来
实现BFS。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int Dire[6][3] = {{0,0,-1},{0,0,1},{0,-1,0},{0,1,0},{-1,0,0},{1,0,0}}; int Map[55][55][55]; struct Node { int x; int y; int z; int time; }; int BFS(int A,int B,int C,int Time) { Node p,p1; int ans = 0xffffff0; p.x = 0; p.y = 0; p.z = 0; p.time = 0; queue<Node> q; q.push(p); while( !q.empty() ) { p = q.front(); q.pop(); if(p.time > Time) continue; if(p.x == A-1 && p.y == B-1 && p.z == C-1) ans = min(ans,p.time); for(int i = 0; i < 6; ++i) { p1.x = p.x + Dire[i][0]; p1.y = p.y + Dire[i][1]; p1.z = p.z + Dire[i][2]; if(p1.x < 0 || p1.y < 0 || p1.z < 0 || p1.x >= A || p1.y >= B || p1.z >= C) continue; if(Map[p1.x][p1.y][p1.z]) continue; Map[p1.x][p1.y][p1.z] = 1; p1.time = p.time + 1; q.push(p1); } } return ans; } int main() { int T; scanf("%d", &T); while(T--) { int A,B,C,Time; scanf("%d%d%d%d",&A,&B,&C,&Time); for(int i = 0; i < A; ++i) for(int j = 0; j < B; ++j) for(int k = 0; k < C; ++k) Map[i][j][k] = 1; 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]); int ans = BFS(A,B,C,Time); if(ans > Time) printf("-1\n"); else printf("%d\n",ans); } return 0; }
时间: 2024-10-09 20:38:04