Cod sursa(job #1100436)

Utilizator t.g.g.tt.g.g.t t.g.g.t Data 6 februarie 2014 21:30:45
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <fstream>
#include <iostream>

using namespace std;

int r,c,b[1005][1005],lista[5000005][2],marime,indice,folosit[1005][1005],x1,x2,y1,y2,mglob,minimu=-1,advr;

char a[1005][1005];

void calc (int i,int j)
{
    while (indice<=marime)
    {
        if (a[i][j-1]!='#' && a[i][j-1]!='*') if (folosit[i][j-1]==0) { b[i][j-1]=b[i][j]+1; folosit[i][j-1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j-1; }
        if (a[i-1][j]!='#' && a[i-1][j]!='*') if (folosit[i-1][j]==0) { b[i-1][j]=b[i][j]+1; folosit[i-1][j]=1; marime++; lista[marime][0]=i-1; lista[marime][1]=j; }
        if (a[i][j+1]!='#' && a[i][j+1]!='*') if (folosit[i][j+1]==0) { b[i][j+1]=b[i][j]+1; folosit[i][j+1]=1; marime++; lista[marime][0]=i; lista[marime][1]=j+1; }
        if (a[i+1][j]!='#' && a[i+1][j]!='*') if (folosit[i+1][j]==0) { b[i+1][j]=b[i][j]+1; folosit[i+1][j]=1; marime++; lista[marime][0]=i+1; lista[marime][1]=j; }
        ++indice;
        if (indice<=marime) { i=lista[indice][0]; j=lista[indice][1]; }
    }
}

void parc (int i,int j,int minima)
{
    //cout<<i<<" "<<j<<"\n";
        if (a[i][j]=='O') if (advr<minima) advr=minima;
        int minimt=minima;
        if (a[i][j-1]!='*' && b[i][j-1]>=mglob && folosit[i][j-1]==0) { folosit[i][j-1]=1; if (minimt>b[i][j-1]) minimt=b[i][j-1]; parc(i,j-1,minimt);}
        minimt=minima;
        if (a[i-1][j]!='*' && b[i-1][j]>=mglob && folosit[i-1][j]==0) { folosit[i-1][j]=1; if (minimt>b[i-1][j]) minimt=b[i-1][j]; parc(i-1,j,minimt);}
        minimt=minima;
        if (a[i][j+1]!='*' && b[i][j+1]>=mglob && folosit[i][j+1]==0) { folosit[i][j+1]=1; if (minimt>b[i][j+1]) minimt=b[i][j+1]; parc(i,j+1,minimt);}
        minimt=minima;
        if (a[i+1][j]!='*' && b[i+1][j]>=mglob && folosit[i+1][j]==0) { folosit[i+1][j]=1; if (minimt>b[i+1][j]) minimt=b[i+1][j]; parc(i+1,j,minimt);}
}

int main ()
{
    ifstream in ("barbar.in");
    ofstream out ("barbar.out");
    in>>r>>c;

    //initializare
    for (int i=1;i<=r;++i) { a[i][0]='#'; a[i][c+1]='#'; }
    for (int i=1;i<=c;++i) { a[0][i]='#'; a[r+1][i]='#'; }


    for (int i=1;i<=r;++i)
    {
        for (int j=1;j<=c;++j)
        {
            in>>a[i][j];
        }
    }

    marime=0;
    for (int i=1;i<=r;++i)
    {
        for (int j=1;j<=c;++j)
        {
            if (a[i][j]=='D') { marime++; lista[marime][0]=i; lista[marime][1]=j; folosit[i][j]=1; }
            if (a[i][j]=='I') { x1=i; y1=j; }
            if (a[i][j]=='O') { x2=i; y2=j; }
        }
    }

    indice=1;
    calc(lista[indice][0],lista[indice][1]);

    for (int i=1;i<=r;++i) { a[i][0]='*'; a[i][c+1]='*'; }
    for (int i=1;i<=c;++i) { a[0][i]='*'; a[r+1][i]='*'; }

    int st=0,dr=1000000;
    advr=-1;
    while (st<=dr)
    {
        for (int i=1;i<=r;++i)
        {
            for (int j=1;j<=c;++j)
            {
                folosit[i][j]=0;
            }
        }
        int m=(st+dr)/2;
        advr=-1;
        mglob=m;
        if (b[x1][y1]>=m) { parc(x1,y1,m); }
        if (advr==-1) { dr=m-1; } else { if (minimu<advr) minimu=advr; st=m+1; }
    }

    out<<minimu;
    in.close();
    out.close();
}