hdoj 2102 A计划 【BFS】

题目:hdoj 2102 A计划点击打开链接

题意:中文的就不说了。求救出公主所需要的最短时间,所以用广搜。

分析:读题之后不难做,比一般的题目多了一个条件就是可以传送,那么我们可以在广搜里面加一个传送的条件就好了。

其次这个题目注意有个坑就是如果两边都是传送门的话也不行

还有注意广搜写法,如果把队列定义成全局的话注意清空!!

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <stack>
#include <vector>
#include <utility>
#include <cmath>
using namespace std;
const int N = 20;
int n,m,t;
char mp[3][N][N];
int vis[3][N][N];
int tx[5]={0,0,1,-1};
int ty[5]={1,-1,0,0};
struct Node
{
    int x,y,z;
    int step;
};
queue<Node> q;
int BFS(Node st,Node en)
{
    vis[st.x][st.y][st.z]=1;
    q.push(st);
    while(!q.empty())
    {
        Node tmp=q.front(),cpp;
        q.pop();
        if(tmp.x==en.x && tmp.y==en.y && tmp.z==en.z){
            return tmp.step;
        }
        //printf("--%d %d %d %c\n",tmp.x,tmp.y,tmp.z,mp[tmp.x][tmp.y][tmp.z]);
        if(mp[tmp.x][tmp.y][tmp.z]=='#')
        {
            cpp.x=(tmp.x+1)%2;
            cpp.y=tmp.y;
            cpp.z=tmp.z;
            if(vis[cpp.x][cpp.y][cpp.z]==1)
                continue;
            if(mp[cpp.x][cpp.y][cpp.z]=='*' || mp[cpp.x][cpp.y][cpp.z]=='#')
                continue;
            q.push(cpp);
            vis[cpp.x][cpp.y][cpp.z]=1;
        }
        else
        {
            for(int i=0;i<4;i++)
            {
                cpp.x=tmp.x;
                cpp.y=tmp.y+tx[i];
                cpp.z=tmp.z+ty[i];
                cpp.step=tmp.step+1;
                if(mp[cpp.x][cpp.y][cpp.z]=='*')
                    continue;
                if(cpp.y>=0 && cpp.z>=0 && cpp.y<n && cpp.z<m && vis[cpp.x][cpp.y][cpp.z]==0)
                {
                    q.push(cpp);
                    vis[cpp.x][cpp.y][cpp.z]=1;
                }
            }
        }
    }
    return -1;
}
int main()
{
    //freopen("Input.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        Node st,en;
        st.x=0,st.y=0,st.step=0,st.z=0;
        scanf("%d%d%d",&n,&m,&t);
        for(int k=0;k<2;k++)
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++){
                    cin>>mp[k][i][j];
                    if(mp[k][i][j]=='P')
                        en.x=k,en.y=i,en.z=j;
                }
        //cout<<en.x<<" "<<en.y<<" "<<en.z<<endl;
        int ans=BFS(st,en);
        if(ans<=t && ans!=-1)
            puts("YES");
        else
            puts("NO");
        while(!q.empty())  //注意这里
            q.pop();
    }
    return 0;
}
时间: 2024-12-17 15:05:18

hdoj 2102 A计划 【BFS】的相关文章

HDOJ 2102 A计划(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 <2>需要注意的地方: 1)如果当前状态为'#'字符,需要传送到另外一层,但是从该层到另外一层的时间是不会计算: 2)如果当前状态为'#'字符,则应该考虑该状态能否拓展:因为另一层的相同位置的字符可能为 'S','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时刻吃掉公主,因为他听信谣言说吃公主的

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