您的位置:首页 > 其它

HDU 1253

2016-02-26 20:50 232 查看
这道题的题目很明确,没有坑,只需要搜索最短路径比对魔王回来的时间就可以了。只是跟平常的搜索有区别的是这道题的地图是三维的。

我们只需要将数据记录在三维数组中进行搜索就行了。

#include<iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stdlib.h>
using namespace std;
#define N 51
char map[N][N][N] = {0};   //三维地图
int A, B, C, T;
char vis[N][N][N] = {0};   //是否搜索过的标记
struct node
{
int x, y, z;
int time;
};
int dir[6][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } };  //方向
int Judge(int x, int y, int z)        //判断边界
{
if (x >= 0 && x < A&& y >= 0 && y < B && z >= 0 && z < C && map[x][y][z] == 0)
{
return 1;
}
else
{
return 0;
}
}
int bfs(int n)  //搜索开始
{
node start, end;
int i;
queue<node>q;
start.x = 0;
start.y = 0;
start.z = 0;
start.time = 0;
q.push(start);
memset(vis, 0, sizeof(vis));
vis[0][0][0] = 1;
while (!q.empty())
{
start = q.front();
q.pop();
if (start.time > n)  //如果已经超过了最短时间返回-1
{
return -1;
}
if (start.x == A - 1 && start.y == B - 1 && start.z == C - 1 && start.time <= n)  //如果到达终点位置返回需要的时间
{
return start.time;
}
int i;
for (i = 0; i < 6; i++)
{
end.x = start.x + dir[i][0];
end.y = start.y + dir[i][1];
end.z = start.z + dir[i][2];
if (Judge(end.x, end.y, end.z) == 1 && vis[end.x][end.y][end.z] == 0)
{
vis[end.x][end.y][end.z] = 1;
end.time = start.time + 1;
if (abs(end.x - A + 1) + abs(end.y - B + 1) + abs(end.z - C + 1) + end.time >n)//此步用来简化搜索
continue;
q.push(end);
}
}
}
return -1;
}
int main()
{
int i, j, k, t;
scanf("%d", &t);
while (t--)
{
scanf("%d%d%d%d", &A, &B, &C, &T);
for (i = 0; i < A; i++)
{
for (j = 0; j < B; j++)
{
for (k = 0; k < C; k++)
{
scanf("%d", &map[i][j][k]);
}
}
}
int ans = 0;
ans = bfs(T);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: