A计划 HDU -

  • F - A计划

  •  HDU - 2102 
  • 题意:
  • 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。 
  • 现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 55
    int t,n,m,TIME;
    char mmp[maxn][maxn][maxn];
    bool vis[maxn][maxn][maxn];
    struct node
    {
        int x,y,z,step;
    } top,temp;
    int to[10][5]= {{1,0},{0,1},{0,-1},{-1,0}};
    bool judge1(int z,int x,int y)
    {
        if(mmp[z][x][y]=='*'||vis[z][x][y]||x<0||y<0||x>=n||y>=m)
            return false;
        return true;
    }
    int  bfs()
    {
        queue<node>q;
        temp.x=0;
        temp.y=0;
        temp.z=1;
        temp.step=0;
        q.push(temp);
        vis[1][0][0]=1;
        while(!q.empty())
        {
            top=q.front();
            q.pop();
            if(mmp[top.z][top.x][top.y]=='P'&&top.step<=TIME)
                return 1;
            else if(mmp[top.z][top.x][top.y]=='P'&&top.step>TIME)
                return -1;
            if(mmp[top.z][top.x][top.y]=='#')
            {
                temp.x=top.x;
                temp.y=top.y;
                temp.step=top.step;
                if(top.z==1)
                {
                    if(judge1(top.z+1,top.x,top.y))
                    {
                        temp.z=top.z+1;
                        q.push(temp);
                        vis[temp.z][temp.x][temp.y]=1;
                    }
                }
                else
                {
                    if(judge1(top.z-1,top.x,top.y))
                    {
                        temp.z=top.z-1;
                        q.push(temp);
                        vis[temp.z][temp.x][temp.y]=1;
                    }
                }
            }
            else
            {
                for(int i=0; i<4; i++)
                {
                    temp.z=top.z;
                    temp.step=top.step+1;
                    temp.x=top.x+to[i][0];
                    temp.y=top.y+to[i][1];
                    if(judge1(temp.z,temp.x,temp.y))
                    {
                        vis[temp.z][temp.x][temp.y]=1;
                        q.push(temp);
                    }
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        cin>>t;
        while(t--)
        {
            memset(vis,0,sizeof(vis));
            cin>>n>>m>>TIME;
            for(int k=1; k<=2; k++)
                for(int i=0; i<n; i++)
                    for(int j=0;j<m;j++)
                    cin>>mmp[k][i][j];
            int ans=bfs();
            if(ans==-1)
                cout<<"NO"<<endl;
            else
                cout<<"YES"<<endl;
        }
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值