HDOJ 1253 胜利大逃亡(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1253

思路分析:因为问题需要寻找到达终点的最短的距离(最短的步数),即在状态转换图上需要找出层次最浅的的状态(A-1, B-1, C-1),

所以采用bfs更快能找出答案;另外,若采用dfs则比较困难,需要遍历所有的状态才能找出结果。

代码如下

#include <cstdio>
#include <iostream>

const int MAX_N = 60;
struct Point
{
    int a, b, c;
    int time;
    Point() { a = 0; b = 0; c = 0; time = 0; }
    Point(int x, int y, int z, int step_time)
    {
        a = x; b = y; c = z; time = step_time;
    }
};

int ans = 0;
int A, B, C, game_times;
int map[MAX_N][MAX_N][MAX_N];
int move[6][3] =
{{0, 0, -1}, {0, 0, 1}, {0, -1, 0}, {0, 1, 0}, {-1, 0, 0}, {1, 0, 0}};
Point queue[1000000];

int Bfs()
{
    int head, tail;
    Point temp;

    head = tail = 0;
    temp.a = temp.b = temp.c = temp.time = 0;
    queue[tail++] = temp;

    while (head != tail)
    {
        temp = queue[head++];
        for (int i = 0; i < 6; ++i)
        {
            int next_a = temp.a + move[i][0];
            int next_b = temp.b + move[i][1];
            int next_c = temp.c + move[i][2];

            if (next_a < 0 || next_b < 0 || next_c < 0
                || next_a >= A || next_b >= B || next_c >= C
                || map[next_a][next_b][next_c] > 0 || temp.time + 1 > game_times)
                continue;

            if (next_a == A - 1 && next_b == B - 1 && next_c == C - 1)
                return temp.time + 1;

            Point next(next_a, next_b, next_c, temp.time + 1);
            map[next_a][next_b][next_c] = next.time;
            queue[tail++] = next;
        }
    }
    return  -1;
}

int main()
{
    int k;

    scanf("%d", &k);
    while (k--)
    {
        scanf("%d %d %d %d", &A, &B, &C, &game_times);
        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]);

        printf("%d\n", Bfs());
    }
    return 0;
}
时间: 2024-11-05 15:53:08

HDOJ 1253 胜利大逃亡(bfs)的相关文章

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,

hdoj 1253 胜利大逃亡

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28023    Accepted Submission(s): 10632 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是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

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块,然后

hdu - 1240 Nightmare &amp;&amp; hdu - 1253 胜利大逃亡(bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1240 开始没仔细看题,看懂了发现就是一个裸的bfs,注意坐标是三维的,然后每次可以扩展出6个方向. 第一维代表在第几层.后两维代表行和列. 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 struct point 6 { 7 int x,y,z,step; 8 b

HDU 1253 胜利大逃亡 NYOJ 523【BFS】

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

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

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

hdoj 1429 胜利大逃亡(续) 【BFS+状态压缩】

题目:hdoj 1429 胜利大逃亡(续) 相同题目: 题意:中文的,自己看 分析:题目是求最少的逃亡时间,确定用BFS 这个题目的难点在于有几个锁对于几把钥匙,唯一的对应关系,不能用直接的标记法,因为一个图可能需要搜索多次. 仔细分析的话会发现,图的搜索次数是和钥匙的出现次数相关,那么我们可以用二进制的0 和 1 来表示第几把钥匙出现过没有,所以我们可以用状态压缩来标记那个钥匙出现过,然后用三维标记,第三维表示出现几个钥匙了的情况下图的点的搜索情况.其他就和简单的一样. AC代码: #incl

杭电1253 胜利大逃亡

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