• 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
    */
    


  • 相关阅读:
    21.显式锁(Lock)的使用
    20.线程间通讯(wait、notify应用)
    18.等待唤醒机制(wait、notify)
    java实现枚举转换成list
    19.wait与sleep的区别
    SpringBoot整合Redis和SpringBoot(SpringCache)整合Redis
    MySQL基础
    Redis操作指令
    python 处理 JSON
    Redis安装CentOS
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3481926.html
Copyright © 2020-2023  润新知