Cod sursa(job #1023448)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 6 noiembrie 2013 23:03:14
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.05 kb
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct Coada
{
    int x,y;
};

Coada q[1000005];
Coada inceput,sfarsit;
int R,C,pr,ul,b[1005][1005],c[1005][1005];
int dx[4]={ -1 , 0 , 1 , 0 };
int dy[4]={ 0 , 1 , 0 , -1 };
char a[1005][1005];

inline void Citire()
{
    int i;
    fin>>R>>C;
    for (i=1;i<=R;i++)
        fin>>(a[i]+1);
    fin.close();
}

inline void InitCoada()
{
    int i,j;
    pr=1;ul=0;
    for (i=1;i<=R;i++)
        for (j=1;j<=C;j++)
            if (a[i][j]=='D')
                {ul++;
                 q[ul].x=i;
                 q[ul].y=j;
                }
}

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

inline void FormeazaMat()
{
    int i,j;
    Coada k,k1;
    while (pr<=ul)
        {
            k=q[pr];
            pr++;
            for (i=0;i<4;i++)
                {
                    k1.x=k.x+dx[i];
                    k1.y=k.y+dy[i];
                    if ((a[k1.x][k1.y]=='.' || a[k1.x][k1.y]=='I' || a[k1.x][k1.y]=='O') && b[k1.x][k1.y]==0)
                        {
                            ul++;
                            q[ul]=k1;
                            b[k1.x][k1.y]=b[k.x][k.y]+1;
                        }
                }

        }

}

inline bool Fill(int x,int y,int s)
{
    if (b[x][y]>=s && a[x][y]!='D' && a[x][y]!='*' && c[x][y]!=-1)
        {
            c[x][y]=-1;
            if (a[x][y]=='O') return 1;
            //fout<<"x="<<x<<"   "<<"y="<<y<<"\n";
            Fill(x-1,y,s);
            Fill(x,y+1,s);
            Fill(x+1,y,s);
            Fill(x,y-1,s);
        }
    return 0;
}

inline void CautareBin()
{
    int i,j,st,dr,mij,soltemp=-1;
    dr=max(R,C);
    st=1;
    for (i=1;i<=R;i++)
        for (j=1;j<=C;j++)
            {
                if (a[i][j]=='I')
                    {inceput.x=i; inceput.y=j;}
                if (a[i][j]=='O')
                    {sfarsit.x=i; sfarsit.y=j;}
            }
    while (st<=dr)
        {
            mij=(st+dr)/2;
            Fill(inceput.x,inceput.y,mij);
            if (c[sfarsit.x][sfarsit.y]==-1)
                    {soltemp=mij;st=mij+1;}
            else dr=mij-1;
            for (i=1;i<=R;i++)
                for (j=1;j<=C;j++)
                    c[i][j]=0;
        }
    /*for (i=1;i<=R;i++)
    {
        for (j=1;j<=C;j++)
            fout<<b[i][j];
        fout<<"\n";
    }*/
    /*for (i=1;i<=R;i++)
    {
        for (j=1;j<=C;j++)
            fout<<c[i][j]<<" ";
        fout<<"\n";
    }*/
    /*if (c[sfarsit.x][sfarsit.y]==-1) fout<<"1\n";
    else fout<<"0\n";*/
    fout<<soltemp<<"\n";
}

int main()
{
    Citire();
    InitCoada();
    Bordare();
    FormeazaMat();
    CautareBin();
    return 0;
}