HDOJ 2102 A计划(bfs)

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

思路分析:

<1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索

<2>需要注意的地方:

1)如果当前状态为‘#‘字符,需要传送到另外一层,但是从该层到另外一层的时间是不会计算;

2)如果当前状态为‘#‘字符,则应该考虑该状态能否拓展;因为另一层的相同位置的字符可能为

‘S‘,‘P‘,‘.‘,‘*‘或者‘#‘,所以对于另一层相同位置的字符可能的各种情况应该考虑到并处理;

只有当字符为’P’或者’.’时才能被传送,其他字符不能传送,即该状态不能拓展,需要被剪枝;

PS:由于没有考虑到另一层的各种情况,导致WA多次,希望引以为鉴。

代码如下:

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAX_N = 10 + 5;
char maze[2][MAX_N][MAX_N];
bool visited[2][MAX_N][MAX_N];
int N, M, T;
int move_[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

struct Node
{
    int x, y, z;
    int time;
    Node() { x = y = z = time = 0; }
    Node(int i, int j, int k, int t) { x = i; y = j; z = k; time = t; }
};

int Bfs()
{
    Node start;
    queue<Node> state;

    state.push(start);
    visited[0][0][0] = true;
    while (!state.empty())
    {
        int x, y, z, t;
        Node temp_state;

        temp_state = state.front();
        state.pop();
        x = temp_state.x;
        y = temp_state.y;
        z = temp_state.z;
        t = temp_state.time;
        for (int i = 0; i < 4; ++i)
        {
            char maze_ch = maze[z][x][y];
            int next_x = x + move_[i][0];
            int next_y = y + move_[i][1];
            int next_z = z;
            int next_time = t + 1;
            char maze_n_ch = maze[next_z][next_x][next_y];

            if (next_x < 0 || next_x >= N || next_y < 0 || next_y >= M
                || next_time > T || visited[next_z][next_x][next_y])
                continue;
            if (maze_n_ch == ‘#‘)
                next_z = 1 - next_z;
            maze_n_ch = maze[next_z][next_x][next_y];
            if (maze_n_ch == ‘*‘ || maze_ch == ‘#‘)
                continue;
            if (maze_n_ch == ‘P‘)
                return next_time;
            Node next_state(next_x, next_y, next_z, temp_state.time + 1);
            state.push(next_state);
            visited[next_z][next_x][next_y] = true;
        }
    }
    return -1;
}

int main()
{
    int case_times;

    scanf("%d", &case_times);
    while (case_times--)
    {
        int ans = 0;

        scanf("%d %d %d", &N, &M, &T);
        for (int i = 0; i < 2; ++i)
        for (int j = 0; j < N; ++j)
            scanf("%s", maze[i][j]);
        memset(visited, 0, sizeof(visited));
        ans = Bfs();
        if (ans == -1)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}
时间: 2024-10-08 20:30:00

HDOJ 2102 A计划(bfs)的相关文章

hdoj 2102 A计划 【BFS】

题目:hdoj 2102 A计划点击打开链接 题意:中文的就不说了.求救出公主所需要的最短时间,所以用广搜. 分析:读题之后不难做,比一般的题目多了一个条件就是可以传送,那么我们可以在广搜里面加一个传送的条件就好了. 其次这个题目注意有个坑就是如果两边都是传送门的话也不行 还有注意广搜写法,如果把队列定义成全局的话注意清空!! #include <cstdio> #include <iostream> #include <queue> #include <cstr

HDU 2102 A计划 BFS

点击打开链接 A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10939    Accepted Submission(s): 2667 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的

HDU 2102 A计划 (BFS或DFS)

题意:中文题. 析:是一个简单的搜索,BFS 和 DFS都可行, 主要是这个题有一个坑点,那就是如果有一层是#,另一个层是#或者*,都是过不去的,就可以直接路过, 剩下的就是一个简单的搜索,只不过是两层而已,可能一个就是在#必须传送,这个题目已经说的很清楚了. 代码如下: BFS: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string>

hdu 2102 A计划(双层BFS)(详解)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她

hdu 2102 A计划 (bfs+队列)

A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9360    Accepted Submission(s): 2265 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.

HDU 2102 A计划 双层BFS

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

hdu 2102 A计划(双层BFS)(具体解释)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,由于他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来解救公主.只是公主早已习以为常,她

HDU 2102 A计划 (深搜)

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位

HDU-2102-A计划(BFS+优先队列)

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出. 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位