杭电2102--A计划(Bfs)

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

骑士救公主,迷宫问题。做的时候思路不清晰,一直Wa, 其实就是没搞清楚从posa-->posb无论b是传送门还是路都会耗时1, 只不过经过传送门又传送到了下一个位置;一直在这个误区里走不出来;Tmdi.
bfs搜一遍就说明搜过来就说明posa一定为点,代码中又把特殊情况全部排除,

所以只有两种情况:

         ‘.‘ --->‘#‘,

          ‘.‘-->‘.‘(包含p, 为搜索结束条件),

瞬间明朗了很多啊。

ac代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char map[2][12][12];
int ac[4][2] = {0, 1, 0, -1, -1, 0, 1, 0};
int n, m, T;
struct Maze
{
    int x, y, z, step;
} r, s, t;
bool Bfs(int x, int y, int z)
{
    r.x = x; r.y = y; r.z = z; r.step = 0;
    queue<Maze> q;
    q.push(r);
    map[x][y][z] = ‘*‘;
    while(!q.empty())
    {
        s = q.front();
        q.pop();
        for(int i = 0; i < 4; i++)
        {
            t = s;
            t.y = s.y + ac[i][0];
            t.z = s.z + ac[i][1];
            t.step = s.step + 1;
            if(t.z >= 0 && t.y >= 0 && t.y < n && t.z < m && map[t.x][t.y][t.z] != ‘*‘)
            {
                if(map[t.x][t.y][t.z] == ‘#‘){
                    map[t.x][t.y][t.z] = ‘*‘;     //标记为‘*‘, 因为后面要标记传送到的地方, 不标记就成了断路;
                    t.x = !s.x;
                }
                if(map[t.x][t.y][t.z] == ‘P‘ && t.step <= T)
                    return true;
                map[t.x][t.y][t.z] = ‘*‘;
                q.push(t);
            }
        }
    }
    return false;
}
int main()
{
    int Qi;
    scanf("%d", &Qi);
    while(Qi--)
    {
        scanf("%d %d %d", &n, &m, &T);
        for(int i = 0; i < 2; i++)
            for(int j = 0; j < n; j++)
                for(int k = 0; k < m; k++)
                    cin >> map[i][j][k];
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)  //把不符题意的路全换成‘*‘;
            {
                if(map[0][i][j] == ‘#‘ && map[1][i][j] == ‘#‘) //上下两层相同位置处都为传送门;
                {
                    map[0][i][j] = ‘*‘;
                    map[1][i][j] = ‘*‘;
                }
                if(map[0][i][j] == ‘#‘ && map[1][i][j] == ‘*‘) //上下两层相同位置处一层为传送门, 一层为墙;
                {
                    map[0][i][j] = ‘*‘;
                }
                if(map[0][i][j] == ‘*‘ && map[1][i][j] == ‘#‘)//同上;
                {
                    map[1][i][j] = ‘#‘;
                }
            }
        if(Bfs(0, 0, 0))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
} 
时间: 2024-08-28 00:22:11

杭电2102--A计划(Bfs)的相关文章

A计划 HDU杭电2102【广搜+STL队列】

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

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时刻吃掉公主,因为他听信谣言说吃公主的

HDOJ 2102 A计划(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 <2>需要注意的地方: 1)如果当前状态为'#'字符,需要传送到另外一层,但是从该层到另外一层的时间是不会计算: 2)如果当前状态为'#'字符,则应该考虑该状态能否拓展:因为另一层的相同位置的字符可能为 'S','P','.','*'或者'#',所以对于另一层相同位置的字符可能的各种情况应该考虑

Oil Deposits(杭电oj1241)(BFS)

Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13013    Accepted Submission(s): 7540 Problem Description The GeoSurvComp geologic survey company is responsible for detecting under

Red and Black(杭电oj1312)(BFS)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10122    Accepted Submission(s): 6313 Problem Description There is a rectangular room, covered with square tiles. Each tile is colo

HDU 2102 A计划 (BFS或DFS)

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

hdoj 2102 A计划 【BFS】

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

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表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位