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\n", ++ic, bfs());
    }
    return 0;
}



posted @ 2016-01-19 13:54  blfshiye  阅读(117)  评论(0编辑  收藏  举报