Cod sursa(job #1474168)

Utilizator radiogard1999Dragoi Andrei radiogard1999 Data 21 august 2015 11:02:39
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

char a[1005][1005],t[1005][1005];
int b[1005][1005];

int r,c;
int dx[]={0,1,-1, 0};
int dy[]={1,0, 0,-1};
queue <pair<int , int> > q;
int xi,yi,xo,yo;
void Citire()
{
    int i,j;
    fin>>r>>c;
    for(i=1;i<=r;i++)
        fin>>(a[i]+1);
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            {
                b[i][j]=2000000;
                if(a[i][j]=='I')
                {
                    xi=i;
                    yi=j;
                    a[i][j]='.';
                }
                else if(a[i][j]=='O')
                {
                    xo=i;
                    yo=j;
                    a[i][j]='.';
                }
            }
    fin.close();
}

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

void Lee()
{
    int i,j,x,y,k;
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            if(a[i][j]=='D')
            {
                q.push(make_pair(i,j));
                b[i][j]=0;
            }
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(k=0;k<=3;k++)
        {
            i=x+dx[k];
            j=y+dy[k];
            if(a[i][j]!='*'&&b[i][j]>b[x][y]+1)
            {
                b[i][j]=b[x][y]+1;
                q.push(make_pair(i,j));
            }
        }
    }

}

void Fill(int i,int j,int d)
{
  t[i][j]='1';
  if(b[i-1][j]>=d&&a[i-1][j]=='.'&&t[i-1][j]=='0')
        Fill(i-1,j,d);
  if(b[i][j-1]>=d&&a[i][j-1]=='.'&&t[i][j-1]=='0')
        Fill(i,j-1,d);
  if(b[i+1][j]>=d&&a[i+1][j]=='.'&&t[i+1][j]=='0')
        Fill(i+1,j,d);
  if(b[i][j+1]>=d&&a[i][j+1]=='.'&&t[i][j+1]=='0')
        Fill(i,j+1,d);
}

void InitT()
{
    int i, j;
    for(i=1;i<=r;i++)
        for(j=1;j<=c;j++)
            t[i][j] = '0';
}

int DistMax()
{
    int dmax, st, dr,mij;
    st = 1; dr = b[xi][yi];
    dmax = 0;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        InitT();
        Fill(xi,yi,mij);
        if (t[xo][yo] == '1') {dmax = mij;st = mij + 1;}
        dr = mij - 1;
    }
    return dmax;
}

int main()
{
    int i;
    Citire();
    Bordare();
    Lee();
    i=DistMax();
    fout<<i<<"\n";
    fout.close();
    return 0;
}