Cod sursa(job #2508386)

Utilizator BAlexandruBorgovan Alexandru BAlexandru Data 11 decembrie 2019 23:28:10
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <queue>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

int n,m,i,j;
char c;
int dist[1002][1002], dmax;
int a[1002][1002];
int viz[1002][1002];
int li,ci, lo,co;
int x,y, xx,yy;

int dx[4]={1, -1, 0,  0};
int dy[4]={0,  0, 1, -1};

queue < pair <int, int> > dragoni;
queue < pair <int, int> > drum;

bool drum_posibil(int L, int nr)
{
    if (dist[li][ci]<L)
        return 0;

    int x,y,i;
    a[li][ci]=1;
    viz[li][ci]=nr;
    drum.push(make_pair(li,ci));
    while (!drum.empty() && viz[lo][co]!=nr)
    {
        x=drum.front().first;
        y=drum.front().second;
        drum.pop();
        for (i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (viz[xx][yy]!=nr && dist[xx][yy]>=L)
            {
                a[xx][yy]=a[x][y]+1;
                viz[xx][yy]=nr;
                drum.push(make_pair(xx, yy));
            }
        }
    }
    while (!drum.empty())
        drum.pop();

    return (viz[lo][co]==nr);
}

int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            f>>c;
            if (c=='I')
            {
                li=i;
                ci=j;
            }
            else if (c=='O')
            {
                lo=i;
                co=j;
            }
            else if (c=='*')
            {
                a[i][j]=-1;
            }
            else if (c=='D')
            {
                dragoni.push(make_pair(i,j));
                a[i][j]=-1;
            }
        }

    for (i=0;i<=n+1;i++)
    {
        a[i][0]=a[i][m+1]=-1;
        dist[i][0]=dist[i][m+1]=-1;
    }
    for (j=0;j<=m+1;j++)
    {
        a[0][j]=a[n+1][j]=-1;
        dist[0][j]=dist[n+1][j]=-1;
    }

    while (!dragoni.empty())
    {
        x=dragoni.front().first;
        y=dragoni.front().second;
        dragoni.pop();
        for (i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if (dist[xx][yy]==0 && a[xx][yy]==0)
            {
                dist[xx][yy]=dist[x][y]+1;
                dmax=max(dmax, dist[xx][yy]);
                dragoni.push(make_pair(xx, yy));
            }
        }
    }

    int st=1, dr=dmax, mij, rez=-1, nr=0;
    while (st<=dr)
    {
        nr++;
        mij=(st+dr)/2;
        if (drum_posibil(mij, nr))
        {
            rez=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    g<<rez;

    return 0;
}