• HDU 5040


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

    题意比较难懂,有摄像头的位置是可以走的,每回合开始看做人先走摄像头再转,也就是说如果你这回合走之前没有摄像头在照你,走之后摄像头转过来被照,时间也只是+1,而不是+3(伪装是瞬间完成的)

    解法显而易见,一个优先队列的bfs,vis数组多开一维,表示时间对4取模

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <map>
    using namespace std ;
    int n ;
    int vis[505][505][4] ;
    int b[505][505][4] ;
    char mp[505][505] ;
    int aa,bb ;
    struct node
    {
        int x,y ;
        int step ;
        friend bool operator <(node aaa,node bbb)
        {
            return aaa.step>bbb.step ;
        }
    } ;
    int dx[]={-1,0,1,0,0} ;
    int dy[]={0,1,0,-1,0} ;
    int bfs(int x,int y)
    {
        memset(vis,0,sizeof(vis)) ;
        priority_queue <node> q ;
        node s ;
        s.x=x ;s.y=y ;s.step=0 ;
        vis[x][y][0]=1 ;
        q.push(s) ;
        while(!q.empty())
        {
            node u=q.top() ;
            //printf("%d %d %d
    ",u.x,u.y,u.step) ;
            if(u.x==aa && u.y==bb)
            {
                return u.step ;
            }
            q.pop() ;
            for(int i=0 ;i<5 ;i++)
            {
                int xx=u.x+dx[i] ;
                int yy=u.y+dy[i] ;
                if(xx<0 || xx>=n || yy<0 || yy>=n)continue ;
                if(mp[xx][yy]=='#')continue ;
                node p ;
                p=u ;
                if(b[xx][yy][u.step%4] || b[u.x][u.y][u.step%4])
                {
                    if(xx==u.x && yy==u.y && !vis[xx][yy][(u.step+1)%4])
                    {
                        p.step++ ;
                        vis[xx][yy][p.step%4]=1 ;
                        q.push(p) ;
                    }
                    else if(!vis[xx][yy][(u.step+3)%4])
                    {
                        p.x=xx ;p.y=yy ;
                        p.step+=3 ;
                        vis[xx][yy][p.step%4]=1 ;
                        q.push(p) ;
                    }
                }
                else if(!vis[xx][yy][(u.step+1)%4])
                {
                    p.x=xx ;p.y=yy ;p.step++ ;
                    vis[xx][yy][p.step%4]=1 ;
                    q.push(p) ;
                }
            }
        }
        return -1 ;
    }
    int main()
    {
        int T ;
        scanf("%d",&T) ;
        for(int cas=1 ;cas<=T ;cas++)
        {
            scanf("%d",&n) ;
            for(int i=0 ;i<n ;i++)
                scanf("%s",mp[i]) ;
            int x,y ;
            memset(b,0,sizeof(b)) ;
            for(int i=0 ;i<n ;i++)
            {
                for(int j=0 ;j<n ;j++)
                {
                    if(mp[i][j]=='M')
                    {
                        x=i ;y=j ;
                    }
                    if(mp[i][j]=='N')
                    {
                        b[i][j][0]=b[i][j][1]=b[i][j][2]=b[i][j][3]=1 ;
                        if(i-1>=0)b[i-1][j][0]=1 ;
                        if(j+1<n)b[i][j+1][1]=1 ;
                        if(j-1>=0)b[i][j-1][3]=1 ;
                        if(i+1<n)b[i+1][j][2]=1 ;
                    }
                    if(mp[i][j]=='W')
                    {
                        b[i][j][0]=b[i][j][1]=b[i][j][2]=b[i][j][3]=1 ;
                        if(i-1>=0)b[i-1][j][1]=1 ;
                        if(j+1<n)b[i][j+1][2]=1 ;
                        if(j-1>=0)b[i][j-1][0]=1 ;
                        if(i+1<n)b[i+1][j][3]=1 ;
                    }
                    if(mp[i][j]=='S')
                    {
                        b[i][j][0]=b[i][j][1]=b[i][j][2]=b[i][j][3]=1 ;
                        if(i-1>=0)b[i-1][j][2]=1 ;
                        if(j+1<n)b[i][j+1][3]=1 ;
                        if(j-1>=0)b[i][j-1][1]=1 ;
                        if(i+1<n)b[i+1][j][0]=1 ;
                    }
                    if(mp[i][j]=='E')
                    {
                        b[i][j][0]=b[i][j][1]=b[i][j][2]=b[i][j][3]=1 ;
                        if(i-1>=0)b[i-1][j][3]=1 ;
                        if(j+1<n)b[i][j+1][0]=1 ;
                        if(j-1>=0)b[i][j-1][2]=1 ;
                        if(i+1<n)b[i+1][j][1]=1 ;
                    }
                    if(mp[i][j]=='T')
                    {
                        aa=i ;bb=j ;
                    }
                }
            }
            printf("Case #%d: %d
    ",cas,bfs(x,y)) ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    Java Concurrency
    Java Annotation,Java注解
    Think in java, notes
    嵌套事务
    java dynamic proxy,动态代理
    埃里克·雷蒙德
    HDU1222 Wolf and Rabbit
    HUT1098 素MM
    HDU1568 Fibonacci
    HDU1501 Zipper DFS+记忆化搜索
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3988290.html
Copyright © 2020-2023  润新知