Cod sursa(job #2088316)

Utilizator dianamariaDiana Cataros dianamaria Data 14 decembrie 2017 23:00:29
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <fstream>

using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
const int N=1003;
const int dl[]={-1,0,1,0};
const int dc[]={0,1,0,-1};
char a[N][N];
struct poz
{
    short int l,c;
};
poz q[N*N],start,stop;
int ans,m,n;
int d[N][N];
bool v[N][N];

int verif(int val)
{
    int i,j,st=0,dr=0;
    poz x,y;
    if (d[start.l][start.c]<val)
        return 0;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            v[i][j]=0;
    v[start.l][start.c]=1;
    q[0]=start;
    while (st<=dr)
    {
        x=q[st];
        for (i=0;i<4;i++)
        {
            y.l=x.l+dl[i];
            y.c=x.c+dc[i];
            if (v[y.l][y.c]==0 && d[y.l][y.c]>=val && a[y.l][y.c]!='*')
            {
                if (a[y.l][y.c]=='O')
                    return 1;
                v[y.l][y.c]=1;
                dr++;
                q[dr]=y;
            }
        }
        st++;
    }
    return 0;
}

int main()
{
    int i,j,st=1,dr=0,mij;
    poz x,y;
    in>>n>>m;
    in.get();
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
        {
            in>>a[i][j];
            if (a[i][j]=='D')
            {
                dr++;
                q[dr].l=i;
                q[dr].c=j;
                v[i][j]=1;
            }
            else
                if (a[i][j]=='I')
                    start.l=i, start.c=j;
                else
                    if (a[i][j]=='O')
                        stop.l=i, stop.c=j;
        }
        in.get();
    }
    for (i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]='*';
    for (j=0;j<=m+1;j++)
        a[0][j]=a[n+1][j]='*';
    while (st<=dr)
    {
        x=q[st];
        for (i=0;i<4;i++)
        {
            y.l=x.l+dl[i];
            y.c=x.c+dc[i];
            if (a[y.l][y.c]!='*' && v[y.l][y.c]==0)
            {
                dr++;
                q[dr]=y;
                v[y.l][y.c]=1;
                d[y.l][y.c]=d[x.l][x.c]+1;
            }
        }
        st++;
    }
    ans=-1;
    st=1, dr=n*m;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (verif(mij))
        {
            st=mij+1;
            ans=mij;
        }
        else
            dr=mij-1;
    }
    out<<ans;
    return 0;
}