HDU1253 胜利大逃亡【BFS】

题目链接:

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

HDU1253 胜利大逃亡【BFS】的相关文章

HDU----1253胜利大逃亡 BFS

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28472    Accepted Submission(s): 10782 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C

HDU1253 胜利大逃亡 BFS

胜利大逃亡 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 15   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Igna

HDU1253 胜利大逃亡

这个问题一看,可以说和UVA532 Dungeon Master完全相同,豪情万丈地做了拷贝来程序修改,一提交结果是"Time Limit Exceeded",满脸困惑.多方调查研究后,终于懂得了程序简洁才是硬道理.也许因为测试数据量大,各个方面改进速度的措施都用了之后,总算是AC了.胜利大逃亡,逃出来了! 问题链接:HDU1253 胜利大逃亡. 题意简述:三维城堡(迷宫),每个点由0(可以经过)和1(墙)组成.输入测试用例数,输入每个例子的立体长宽高和限定的时间,起点是<1,1

HDU 1253 胜利大逃亡(BFS)

#include <iostream> #include <cstdlib> #include <cstdio> #include <queue> #include <cstring> using namespace std; struct node{ int x,y,z,step; }; int ma[51][51][51]; int A,B,C,T; int mv[6][3] = {{1,0,0},{0,1,0},{0,0,1},{-1,0,

hdu1253胜利大逃亡

胜利大逃亡Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29463    Accepted Submission(s): 11101 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵

poj 2251Dungeon Master+hdu 1253 胜利大逃亡(bfs)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18875   Accepted: 7324 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled

HDOJ1253 胜利大逃亡 BFS

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 29528 Accepted Submission(s): 11136 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开

HDU1253 胜利大逃亡 dfs

Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口

HDU 1253 胜利大逃亡 BFS 简单题

题意: Ignatius要从迷宫的(1,1,1)在时间t内跑到(a,b,c),问可不可能. (题目本来是从(0,0,0)跑到(a-1,b-1,c-1)的) 简单的3维bfs 加剪枝: a+b+c-3>t  速度会快不少. 不过我这里没有加. Input 输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后