• hdu 5040 BFS 多维化处理图


    http://acm.hdu.edu.cn/showproblem.php?pid=5040

    跟这一题http://blog.csdn.net/u011026968/article/details/39586669

    算是异曲同工。

    所以比較easy想到了vis[4][MAXN][MAXN] 表示监控摄像头转4个方向

    那个3秒跟蛇也非常像,但是处理起来还有点麻烦。參考了这里:
    http://blog.csdn.net/hongrock/article/details/39472269

    写的真不错:

    方法:

    dir数组就是依照顺时针方式的四个方向

    den[4][MAXN][MAXN]处理出来图上各个时间是否须要延迟3秒

    假设如今所在位置或者下一个位置在受监控区,就须要3秒

    只是略蛋疼的是,那个3秒,假设如今在受监控区,下一秒就不在了,还是须要3秒。这个题目的离散时间跟现实连续时间有差异感觉好怪


    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define CL(a,b) memset(a,b,sizeof(a))
    #define IN(s) freopen(s,"r",stdin)
    #define OUT(s) freopen(s,"w",stdout)
    const int MAXN = 500+30;
    
    struct Node{
        int x,y,t;
        Node(){}
        Node(int x, int y, int t):x(x),y(y),t(t){}
        bool operator < (const Node & tm)const{
            return t>tm.t;
        }
    };
    
    int mx,my,n;
    char mat[MAXN][MAXN];
    int vis[4][MAXN][MAXN], den[4][MAXN][MAXN];
    int dir[4][2]={ {-1,0},{0,1},{1,0},{0,-1}};
    
    inline int alp(char c)
    {
        if(c == 'N')return 0;
        if(c == 'S')return 2;
        if(c == 'W')return 3;
        if(c == 'E')return 1;
        return -1;
    }
    
    inline int legal(int x, int y)
    {
        if(x>=0 && y>=0 && x<n && y<n && mat[x][y]!='#')
            return 1;
        return 0;
    }
    
    
    int bfs()
    {
        priority_queue<Node>q;
        CL(vis,0);
        q.push(Node(mx,my,0));
        while(!q.empty())
        {
            Node tmp=q.top();
            q.pop();
            if(vis[tmp.t%4][tmp.x][tmp.y])continue;
            if(mat[tmp.x][tmp.y] == 'T')return tmp.t;
    
            vis[tmp.t%4][tmp.x][tmp.y]=1;
            q.push(Node(tmp.x,tmp.y,tmp.t+1));
            for(int i=0;i<4;i++)
            {
                int x=tmp.x+dir[i][0];
                int y=tmp.y+dir[i][1];
                if(!legal(x,y))continue;
                int tmpt=tmp.t;
                if(den[tmp.t%4][x][y] || den[tmp.t%4][tmp.x][tmp.y])tmpt+=3;
                else tmpt++;
                if(!vis[tmpt%4][x][y])q.push(Node(x,y,tmpt));
            }
        }
        return -1;
    }
    
    int main()
    {
        //IN("hdu5040.txt");
        int ncase,ic=0;
        scanf("%d",&ncase);
        while(ncase--)
        {
            CL(den,0);
            scanf("%d",&n);
            for(int i=0;i<n;i++)
            {
                scanf("%s",mat[i]);
                for(int j=0;j<n;j++)
                {
                    if(mat[i][j] == 'M'){mx=i;my=j;}
                    else
                    {
                        int al=alp(mat[i][j]);
                        if(~al)//al==-1的时候,此处推断条件才是0
                        {
                            for(int k=0;k<4;k++)
                            {
                                den[k][i][j]=1;// N S E W
                                int x=i+dir[(al+k)%4][0];
                                int y=j+dir[(al+k)%4][1];
                                if(x>=0 && y>=0 && x<n && y<n)den[k][x][y]=1;
                            }
                        }
                    }
                }
                //getchar();
            }
            printf("Case #%d: %d
    ", ++ic, bfs());
        }
        return 0;
    }
    



  • 相关阅读:
    PP常用bapi
    sap 常用表
    MM常用BADI
    submit 后台运行代码
    SAP 采购订单行项目中科目分配被隐藏,发现行项目设置中显示字段长度为0
    SAP 创建物料主数据分类视图特性
    去读物料的分类值
    SAP 常用函数
    SAP 禁止某个库位的货物移动
    SAP 打开账期
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5142025.html
Copyright © 2020-2023  润新知