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;
}


版权声明:本文博主原创文章。博客,未经同意不得转载。

posted @ 2015-10-24 10:41  zfyouxi  阅读(193)  评论(0编辑  收藏  举报