• hdu A计划


    这道题是一道bfs的题目,因为题目中给的数据很小,所以可以采用优先队列的方式来简化处理。这道题在搜索的过程中要注意map1的不同层次的转换,即对'#'的理解。之前wa了两次是因为我考虑了如果上下两层对应位置都是'#'时输出'NO’,但是这是错误的,可以不考虑这个问题,也可以当上下两层都是‘#’时将它们赋成‘*’;

    具体步骤看程序及程序上的注释:

    #include"iostream"
    #include"stdio.h"
    #include"cmath"
    #include"string.h"
    #include"queue"
    #include"algorithm"
    #define mx 15
    using namespace std;
    char map1[mx][mx][2];//三维的地图
    int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//上下左右四个方向
    int n,m,t,sx,sy,sz,ex,ey,ez;
    struct node
    {
        int x,y,z,time;
        friend bool operator<(node a,node b)//优先队列中的元素按时间的从小到大排序
        {
            return b.time<a.time;
        }
    };
    int judge(int x,int y,int z)//判断当前位置的情况
    {
        if(x>=0&&x<n&&y>=0&&y<m)
        {
            if(map1[x][y][z]=='.') return 0;
            else if(map1[x][y][z]=='#') return 1;
            else return -1;
        }
        else return -1;
    }
    void bfs()
    {
        priority_queue<node> q;//构造优先队列
        node cur,next;
        int i;
        cur.x=sx;
        cur.y=sy;
        cur.z=sz;
        cur.time=0;
        q.push(cur);
        while(!q.empty())//队列非空就进行循环
        {
            cur=q.top();
            q.pop();//记得出队列
            if(cur.x==ex&&cur.y==ey&&cur.z==ez&&cur.time<=t)//找到了目标位置就输出并返回
                {cout<<"YES"<<endl;return;}
            for(i=0;i<4;i++)
            {
                next.x=cur.x+dir[i][0];
                next.y=cur.y+dir[i][1];
                next.z=cur.z;
                int re=judge(next.x,next.y,next.z);//判断走过一步后的情况
                if(re==-1) continue;
                else
                {
                    if(re==0)
                   {
                    map1[next.x][next.y][next.z]='*';
                    next.time=cur.time+1;
                    q.push(next);
                   }
                   else if(re==1)
                   {
                        next.z=(cur.z+1)%2;
                        re=judge(next.x,next.y,next.z);//判断时空隧道的对应位置是什么
                        if(re==0)
                            { next.time=cur.time+1;map1[next.x][next.y][next.z]='*';q.push(next);}
                   }
                }
            }
        }
        cout<<"NO"<<endl;
    }
    int main()
    {
        int c;
        cin>>c;
        while(c--)
        {
            int i,j,k;
            cin>>n>>m>>t;
            for(k=0;k<=1;k++)
            {
                for(i=0;i<n;i++)
                {
                    for(j=0;j<m;j++)
                    {
                        cin>>map1[i][j][k];
                        if(map1[i][j][k]=='S')
                        {
                            sx=i;sy=j;sz=k;
                            map1[i][j][k]='*';
                        }
                        else if(map1[i][j][k]=='P')
                        {
                            map1[i][j][k]='.';
                            ex=i;ey=j;ez=k;
                        }
                    }
                }
                if(k==0)getchar();////注意在输入过程中的空格
            }
            bfs();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    IIS下 多站点 利用虚拟目录 访问共用(图片)文件夹
    [转]Prevent opening multiple windows in ASP.NET
    [转]使用 WebForms ReportViewer 控件
    ALTER TABLE ADD 增加多个字段 外键约束
    获取数据库内某时间点后修改的存储过程
    SQL Server 示例数据库 AdventureWorks 数据字典
    [转]MVC 3.0 在各个版本IIS中的部署
    [转]使用jQuery.ajax傳送物件陣列給ASP.NET MVC
    [转]报表统计(sql面试题)
    扑克游戏 – 打联手
  • 原文地址:https://www.cnblogs.com/acm-jing/p/4328496.html
Copyright © 2020-2023  润新知