Cod sursa(job #1926181)

Utilizator dragos231456Neghina Dragos dragos231456 Data 14 martie 2017 00:53:24
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.47 kb
#include <iostream>
#include <fstream>
using namespace std;

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

struct {
    int x,y;
}v[1000003],d[1000003];

long long n,m,a[1003][1003],b,k,h,o,lin,col,lt=-1,rt,md,nrdrg,rti;
long long dir_l[4]={-1,0,1,0}, dir_c[4]={0,1,0,-1};
char c;
bool ok=false;


int valid(int r, int c)
{
    if(r<=n && c<=m && r>0 && c>0 && a[r][c]==0) return 1;
    else return 0;
}

int corect(int r, int c)
{
    if(r<=n && c<=m && r>0 && c>0) return 1;
    else return 0;
}

int verif()
{
    if(a[lin][col]==1000000) return 1;
    else return 0;
}


void dmax()
{
    for(int ind=1;ind<=nrdrg;++ind)
    {
        for(int i=-md;i<=0;++i)
        {
            for(int j=-i-md;j<=i+md;++j)
            {
                if(valid(i+d[ind].x, j+d[ind].y))
                {
                    a[i+d[ind].x][j+d[ind].y]=1;
                }
                else if(corect(i+d[ind].x, j+d[ind].y) && a[i+d[ind].x][j+d[ind].y]>999998 )
                {
                    rt--;
                    break;
                }
            }
            if(rti!=rt)
                {
                    break;
                }
        }
        if(rti!=rt)
                {
                    break;
                }
        for(int i=1;i<=md;++i)
        {
            for(int j=-md+i;j<=md-i;++j)
            {
                if(valid(i+d[ind].x, j+d[ind].y))
                {
                    a[i+d[ind].x][j+d[ind].y]=1;
                }
                else if(corect(i+d[ind].x, j+d[ind].y) && a[i+d[ind].x][j+d[ind].y]>999998 )
                {
                    rt--;
                    break;
                }
            }
             if(rti!=rt)
                {
                    break;
                }
        }
         if(rti!=rt)
                {
                    break;
                }
    }
}


void curat()
{
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            if(a[i][j]==1) a[i][j]=0;
        }
    }
}


void afisare()
{
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            cout<<a[i][j]<<' ';
        }
        cout<<endl;
    }
    cout<<endl;
}


int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
        {
            f>>c;
            if(c=='*') a[i][j]=-2;
            else if(c=='D')
            {
                a[i][j]=-2;
                ++nrdrg;
                d[nrdrg].x=i;
                d[nrdrg].y=j;
            }
            else if(c=='I')
            {
                a[i][j]=999999;
                v[1].x=i;
                v[1].y=j;
            }
            else if(c=='O') a[i][j]=1000000;
        }
    }
    rt=max(n,m)+1;
    while(rt-lt!=1)
    {
        md=(rt+lt)/2;
        rti=rt;
        dmax();
        if(rti!=rt)
        {
            curat();
        }
        else {
        b=k=1;
        while(b<=k)
        {
            h=v[b].x; o=v[b].y;
            for(int i=0;i<=3;++i)
            {
                lin=h+dir_l[i];
                col=o+dir_c[i];
                if(valid(lin,col))
                {
                    ++k;
                    v[k].x=lin;
                    v[k].y=col;
                    a[lin][col]=1;
                }
                if(verif())
                {
                    ok=true;
                    break;
                }
            }
            if(verif()) break;
            ++b;
        }
        if(verif()) lt=md;
        else rt=md;
        curat();
        }
    }
    if(!ok)
    {
        for(int i=1;i<=nrdrg;++i)
        {
            a[d[i].x][d[i].y]=0;
        }
        b=k=1;
        while(b<=k)
        {
            h=v[b].x; o=v[b].y;
            for(int i=0;i<=3;++i)
            {
                lin=h+dir_l[i];
                col=o+dir_c[i];
                if(valid(lin,col))
                {
                    ++k;
                    v[k].x=lin;
                    v[k].y=col;
                    a[lin][col]=1;
                }
                if(verif())
                {
                    ok=true;
                    break;
                }
            }
            if(verif()) break;
            ++b;
        }
        if(verif())
        {
            lt=-1;
            ok=true;
        }
    }
    if(ok) g<<lt+1;
    else g<<-1;
    return 0;
}