zoukankan      html  css  js  c++  java
  • HDU

    题目:

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

    思路:

    填坑填坑了!!!!

    其实这题只用一个BFS就搞定了,在状态点里边多加一个属性表示这个状态在哪一层里边,就可以了。

    代码:

    #include <bits/stdc++.h>
    #include <iostream>
    #define FRE() freopen("in.txt","r",stdin)
    
    using namespace std;
    const int maxn = 15;
    int dx[4]= {0,0,-1,1};
    int dy[4]= {1,-1,0,0};
    int vis[2][maxn][maxn];
    char mp[2][maxn][maxn];
    int n,m,t;
    struct Node
    {
        int x,y,lev,c;
    };
    
    
    bool isin(int x,int y)
    {
        return x>=0&&x<n&&y>=0&&y<m;
    }
    
    bool BFS()
    {
        queue<Node> que;
        vis[0][0][0] = 1;
        que.push(Node{0,0,0,0});
        while(!que.empty())
        {
            Node p = que.front();
            que.pop();
            if(mp[p.lev][p.x][p.y]=='P' && p.c<=t)
                return true;
            for(int i=0; i<4; i++)
            {
                int tx = p.x+dx[i],ty = p.y+dy[i];
                if(isin(tx,ty) && mp[p.lev][tx][ty]!='*' && !vis[p.lev][tx][ty])
                {
                    if(mp[p.lev][tx][ty]=='P'||mp[p.lev][tx][ty]=='.')//同一层中进行遍历
                    {
                        vis[p.lev][tx][ty] = 1;
                        que.push(Node{tx,ty,p.lev,p.c+1});
                    }
                    else if(mp[p.lev][tx][ty]=='#' && !vis[(p.lev+1)%2][tx][ty])//不同层中进行传送
                    {
                        if(mp[(p.lev+1)%2][tx][ty]!='#' && mp[(p.lev+1)%2][tx][ty]!='*')//避免无限制的传送和撞死
                        {
                            vis[p.lev][tx][ty] = 1;
                            vis[(p.lev+1)%2][tx][ty] = 1;
                            que.push(Node{tx,ty,(p.lev+1)%2,p.c+1});
                        }
                    }
                }
            }
        }
        return false;
    }
    
    int main()
    {
        //FRE();
        int kase;
        cin>>kase;
        while(kase--)
        {
            memset(vis,0,sizeof(vis));
            cin>>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(BFS())
                cout<<"YES
    ";
            else
                cout<<"NO
    ";
        }
        return 0;
    }
  • 相关阅读:
    MySQL主从复制的作用?
    MySQL的逻辑架构
    SQL语句的执行流程
    Count(*)在不同引擎的实现方式
    视图
    MySQL经典练习题(五)
    pyinstaller基本操作
    git基本操作
    Ubuntu安装tensorflow
    ScrollView can host only one direct child
  • 原文地址:https://www.cnblogs.com/sykline/p/10496736.html
Copyright © 2011-2022 走看看