Cod sursa(job #1460599)

Utilizator ciocan_catalinCiocan Catalin - Iulian ciocan_catalin Data 13 iulie 2015 12:40:45
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,startx,starty,stopx,stopy;
int d[1005][1005];
char a[1005][1005];

void Read()
{
    int i,j;
    char c;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        fin>>c;
        a[i][j] = c;
        if(c=='I')
        {
            startx = i;
            starty = j;
        }
         else if(c=='O')
        {
            stopx = i;
            stopy = j;
        }
    }
}

bool OK(int i, int j)
{
    if(i>n || j>m || i<1 || j<1) return false;
    return true;
}

void Marcheaza(int D)
{
    int i,j,x1,x2,y1,y2,cnt,y;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++) d[i][j] = 0;
     for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(a[i][j]=='D')
        {
            d[i][j] = 1;
            x1 = max(i-D,1);
            x2 = min(i+D,n);
            for(x1;x1<=x2;x1++)
                d[x1][j] = 1;
            y1 = max(1,j-D);
            y2 = min(j+D,m);
            for(y1;y1<=y2;y1++) d[i][y1] = 1;
            x2 = max(i-D,1);
            cnt = D-1;
            for(x1 = i-1; x1 > x2; x1--)
            {
                for(y=j+1;y<=j+cnt && y<=m ;y++) d[x1][y] = 1;
                for(y=j-1;y>=j-cnt && y>=1 ;y--) d[x1][y] = 1;
                cnt--;
            }
            x2 = min(i+D,n);
            cnt = D-1;
            for(x1 = i+1; x1 < x2; x1++)
            {
                for(y=j+1;y<=j+cnt && y<=m ;y++) d[x1][y] = 1;
                for(y=j-1;y>=j-cnt && y>=1 ;y--) d[x1][y] = 1;
                cnt--;
            }

        }
        else if(a[i][j]=='*') d[i][j] = 1;
}

void Fill(int i, int j)
{
        d[i][j] =  2;
        if(d[i+1][j]==0 && i<n)
            Fill(i+1,j);
        if(d[i-1][j]==0 && i>1)
            Fill(i-1,j);
        if(d[i][j+1]==0 && j<m)
            Fill(i,j+1);
        if(d[i][j-1]==0 && j>1)
            Fill(i,j-1);
}




bool Check()
{
    if(d[startx][starty]==0)
        Fill(startx,starty);
    if(d[stopx][stopy]==2) return true;
    return false;
}



int main()
{
    int st,dr,m,sol;
    Read();
    st = 0;
    dr = n+m;
   while(st<=dr)
    {
        m = (st+dr)/2;
        Marcheaza(m);
        if(Check()==true)
        {
            sol = m;
            st = m+1;
        }
        else dr = m-1;
    }
    fout<<sol+1<<"\n";
    fout.close();
    return 0;
}