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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值