HDU 1253

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

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

#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; }

你可能感兴趣的:(HDU 1253)