zoukankan      html  css  js  c++  java
  • poj 3501 Escape from Enemy Territory 二分+bfs

    水题,不解释。

    #include<stdio.h>
    #include<math.h>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define N 1000002
    struct node
    {
        int x,y;
        int dis;
    }base[10005],st,end;
    int n,m;
    int maps[1005][1005];
    bool vis[1005][1005];
    int dx[]={0,0,-1,1};
    int dy[]={-1,1,0,0};
    struct que
    {
        struct node t[N];
        int head,tail;
        void init()
        {
            head = tail = 0;
        }
        bool empty()
        {
            return head == tail;
        }
        struct node top()
        {
            return t[head];
        }
        void push(struct node a)
        {
            t[tail] = a;
            tail ++;
            if(tail >= N)
                tail -= N;
        }
        void pop()
        {
            head ++;
            if(head >= N)
                head -= N;
        }
    }q;
    int maxn;
    int leng;
    bool isok(int x,int y)
    {
        return x>=0&&x<n&&y>=0&&y<m;
    }
    void debug_map()
    {
        for(int i=0;i<n;i++,puts(""))
            for(int j=0;j<m;j++)
                printf("%3d",maps[i][j]);
    }
    void bfs()
    {
        node tt,tmp;
        while(!q.empty())
        {
            tmp=q.top();
            for(int d=0;d<4;d++)
            {
                tt.x=tmp.x+dx[d];
                tt.y=tmp.y+dy[d];
                tt.dis=tmp.dis+1;
                if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]==-1)
                {
                    maps[tt.x][tt.y]=tt.dis;
                    maxn=max(maxn,tt.dis);
                    q.push(tt);
                }
            }
            q.pop();
        }
    }
    bool cal(int lim)
    {
        if(maps[st.x][st.y]<lim) return false;
        q.init();
        q.push(st);
        node tmp,tt;
        for(int i=0;i<=n;i++)
                memset(vis[i],false,sizeof(bool)*(m+1));
    
        while(!q.empty())
        {
            tmp=q.top();
            for(int d=0;d<4;d++)
            {
                tt.x=tmp.x+dx[d];
                tt.y=tmp.y+dy[d];
                tt.dis=tmp.dis+1;
                if(isok(tt.x,tt.y)&&maps[tt.x][tt.y]>=lim&&!vis[tt.x][tt.y])
                {
                    vis[tt.x][tt.y]=true;
                    if(tt.x==end.x&&tt.y==end.y)
                    {
                        leng=tt.dis;
                        return true;
                    }
                    q.push(tt);
                }
            }
            q.pop();
        }
        return false;
    }
    int main()
    {
        int cas;
        scanf("%d",&cas);
        st.dis=0;
        int tt;
        while(cas--)
        {
            q.init();
            maxn=0;
            scanf("%d%d%d",&tt,&n,&m);
            scanf("%d%d%d%d",&st.x,&st.y,&end.x,&end.y);
    
            for(int i=0;i<n;i++)
                memset(maps[i],-1,sizeof(int)*(m+1));
                node t;t.dis=0;
            for(int i=0;i<tt;i++)
            {
                scanf("%d%d",&base[i].x,&base[i].y);
                maps[base[i].x][base[i].y]=0;
    
                t.x=base[i].x;
                t.y=base[i].y;
    
                q.push(t);
            }
            bfs();
            int l=0,r=n+m;
            int mid;
            int ans=0;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(cal(mid)) {ans=mid;l=mid+1;}
                else r=mid-1;
            }
            printf("%d %d
    ",ans,leng);
        }
        return 0;
    }
    /*
    3 3 3
    0 0 2
    1 0
    1 1
    1 2
    */
    


  • 相关阅读:
    【CS Round #46 (Div. 1.5) B】Letters Deque
    【CS Round #46 (Div. 1.5) A】Letters Deque
    【Codeforces Round #432 (Div. 2) A】 Arpa and a research in Mexican wave
    【Codeforces Round #432 (Div. 2) B】Arpa and an exam about geometry
    【Codeforces Round #432 (Div. 1) A】 Five Dimensional Points
    【2017 Multi-University Training Contest
    Managing remote devices
    防止表单重复提交的解决方案整理
    防止表单重复提交的解决方案整理
    日期格式化函数
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3481926.html
Copyright © 2011-2022 走看看