zoukankan      html  css  js  c++  java
  • hdu2102(bfs)

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

    分析:bfs求最短时间到达'P'点,不过本题有好几个trick,我都踩到了,自己还是太嫩了。。。

            注意:可能两层同个位置都是'#',还有经过'#'时只能被传送,不能经过它上下左右移动。。。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdlib>
    #include <stack>
    #include <vector>
    #include <set>
    #include <map>
    #define LL long long
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define N 100010
    using namespace std;
    int n,m,t;
    char s[2][15][15];
    struct node
    {
        int x,y,z,step;
        bool operator<(const node &a)const
        {
            return step>a.step;
        }
    };
    int dx[]={1,-1,0,0,0,0};
    int dy[]={0,0,1,-1,0,0};
    int dz[]={0,0,0,0,1,-1};
    int vis[2][15][15],flag;
    node make_node(int a,int b,int c,int d)
    {
        node temp;
        temp.x=a;temp.y=b;
        temp.z=c;temp.step=d;
        return temp;
    }
    int judge(int a,int b,int c)
    {
        return a>=0&&a<2&&b>=0&&b<n&&c>=0&&c<m&&!vis[a][b][c]&&s[a][b][c]!='*';
    }
    void bfs(int xx,int yy,int zz)
    {
        priority_queue<node>que;
        while(!que.empty())que.pop();
        memset(vis,0,sizeof(vis));
        node cur,nxt;
        vis[xx][yy][zz]=1;
        que.push(make_node(xx,yy,zz,0));
        while(!que.empty())
        {
            cur=que.top();que.pop();//进入队列的step不同步时,最好用优先队列保证最小步数出队
            if(s[cur.x][cur.y][cur.z]=='P')
            {
                if(cur.step<=t)flag=1;
                return ;
            }
            for(int i=0;i<6;i++)
            {
                int x=cur.x+dx[i],y=cur.y+dy[i],z=cur.z+dz[i];
                if(judge(x,y,z))
                {
                    if(dx[i]&&s[cur.x][cur.y][cur.z]!='#')continue;//该位置可传送
                    if(dx[i]&&s[x][y][z]=='#')continue;//两边都是传送机
                    if(s[cur.x][cur.y][cur.z]=='#'&&!dx[i])continue;//这里被坑了好久,不能左右上下移动了
                    vis[x][y][z]=1;
                    if(dx[i])
                        que.push(make_node(x,y,z,cur.step));
                    else
                        que.push(make_node(x,y,z,cur.step+1));
                }
            }
        }
    }
    int main()
    {
        int x,y,z,cas;
        scanf("%d",&cas);
        while(cas--)
        {
            scanf("%d%d%d",&n,&m,&t);
            for(int i=0;i<=1;i++)
            {
                for(int j=0;j<n;j++)
                {
                    scanf("%s",s[i][j]);
                }
            }
            flag=0;
            bfs(0,0,0);
            if(flag)puts("YES");
            else puts("NO");
        }
    }
    View Code
  • 相关阅读:
    Eclipse下配置javaweb项目快速部署到tomcat
    SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)
    # 浏览器兼容性 小结
    # HTML && CSS 学习笔记
    # li鼠标移入移出,点击,变背景色,变checkbox选中状态
    SpringMVC开发入门讲义
    Spring同mybatis整合讲义(事物)
    Spring中的AOP开发
    Spring框架IOC,DI概念理解
    Mybatis里SQL语句的分页
  • 原文地址:https://www.cnblogs.com/lienus/p/4173951.html
Copyright © 2011-2022 走看看