Cod sursa(job #2475587)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 17 octombrie 2019 10:35:07
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <algorithm>
#include <cstdio>
#include <queue>

using namespace std;

const int INF=1e6;
int dist[1005][1005],a[1005][1005],viz[1005][1005];
queue < pair<int,int> > q;
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
int sx,sy,ex,ey,r,c;
int isok(int val)
{
    int ax,ay,i,j;
    for(i=1;i<=r;++i)
        for(j=1;j<=c;++j)
            viz[i][j]=0;
    if(dist[sx][sy]>=val)
        q.push(make_pair(sx,sy));
    while(!q.empty())
    {
        if(q.front().first==ex&&q.front().second==ey)
            break;
        for(i=1;i<=4;++i)
        {
            ax=q.front().first+dx[i];
            ay=q.front().second+dy[i];
            if(dist[ax][ay]>=val&&(ax>=1&&ax<=r)&&(ay>=1&&ay<=c)&&!viz[ax][ay]&&!a[ax][ay])
                q.push(make_pair(ax,ay)),viz[ax][ay]=1;
        }
        viz[q.front().first][q.front().second]=1;
        q.pop();
    }
    if(!q.empty())
    {
        while(!q.empty())
            q.pop();
        return 1;
    }
    return 0;
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j,ax,ay,val=0;
    char ch;
    scanf("%d %d\n",&r,&c);
    for(i=1;i<=r;++i)
    {
        for(j=1;j<=c;++j)
        {
            scanf("%c",&ch);
            dist[i][j]=INF;
            if(ch=='I')sx=i,sy=j;
            if(ch=='O')ex=i,ey=j;
            if(ch=='*')a[i][j]=1;
            if(ch=='D')a[i][j]=2,dist[i][j]=0,q.push(make_pair(i,j));
        }
        scanf("\n");
    }

    while(!q.empty())
    {
        for(i=1;i<=4;++i)
        {
            ax=q.front().first+dx[i];
            ay=q.front().second+dy[i];
            if(!a[ax][ay]&&(ax>=1&&ax<=r)&&(ay>=1&&ay<=c))
            {
                if(dist[q.front().first][q.front().second]+1<dist[ax][ay])
                {
                    q.push(make_pair(ax,ay));
                    dist[ax][ay]=dist[q.front().first][q.front().second]+1;
                    val=max(val,dist[ax][ay]);
                }
            }
        }
        q.pop();
    }

    /*for(i=1;i<=r;++i)
    {
        for(j=1;j<=c;++j)
            if(dist[i][j]!=INF)
                printf("%2d ",dist[i][j]);
            else
                printf("-1 ");
        printf("\n");
    }*/
    int st=1,dr=val,med,ans=0,ok;
    while(st<dr)
    {
        med=(st+dr)/2;
        if(med==st)
            break;
        ok=isok(med);
        if(ok==1)
        {
            ans=max(ans,med);
            st=med;
        }
        else
            dr=med;
    }
    printf("\n%d",ans);
    return 0;
}