题目链接:
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;
}
原文:http://blog.csdn.net/lianai911/article/details/44892767