Cod sursa(job #1464797)

Utilizator adiXMGemene Adrian adiXM Data 24 iulie 2015 19:36:40
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.34 kb
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char c[1005][1005];
int a[1005][1005];
int b[1005][1005];
int dl[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};
int prim,ultim;
struct Poz{

    int lin,col;

};
Poz Q[1000005];
int n,m;
int stx,sty,stopx,stopy;
inline void Citire()
{
    f>>n>>m;
    for(int i=1;i<=n;i++)
    {
        f>>(c[i]+1);
        for(int j=1;j<=m;j++)
        {
            if(c[i][j]=='*')
            {
                a[i][j]=-1;
                b[i][j]=-1;
            }
            else
                if(c[i][j]=='I')
                {
                    stx=i;
                    sty=j;
                }
            else
                if(c[i][j]=='O')
                {
                    stopx=i;
                    stopy=j;
                }
            else
                if(c[i][j]=='D')
                    a[i][j]=-1;

        }
    }
}
inline void Bordare()
{
    for(int i=1;i<=n;i++)
        a[i][m+1]=a[i][0]=-1;
    for(int i=1;i<=m;i++)
        a[0][i]=a[n+1][i]=-1;
    for(int i=1;i<=n;i++)
        b[i][m+1]=b[i][0]=-1;
    for(int i=1;i<=m;i++)
        b[0][i]=b[n+1][i]=-1;
}
inline void Dragon()
{
    ultim=0;
    prim=1;
    Poz pc,ps,p,v;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(c[i][j]=='D')
            {
                ps.lin=i;
                ps.col=j;
                Q[++ultim]=ps;
                b[ps.lin][ps.col]=1;
            }
    while(prim<=ultim)
    {
        p=Q[prim];
        prim++;
        for(int i=0;i<4;i++)
        {
            v.lin=p.lin+dl[i];
            v.col=p.col+dc[i];
            if(b[v.lin][v.col]==0)
            {
                ultim++;
                Q[ultim]=v;
                b[v.lin][v.col]=b[p.lin][p.col]+1;
            }
        }
    }
}
inline bool Lee(int dist)
{
    int ret=0;
    ultim=0;
    prim=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(c[i][j]=='.' || c[i][j]=='I' || c[i][j]=='O')
            {
                a[i][j]=-1;
                if(b[i][j]>=dist)
                    a[i][j]=0;
            }
    Poz ps,p,v;
    ps.lin=stx;
    ps.col=sty;
    Q[++ultim]=ps;
    if(a[ps.lin][ps.col]==-1)
        return 0;
    a[ps.lin][ps.col]=1;
    while(prim<=ultim && a[stopx][stopy]==0)
    {
        p=Q[prim];
        prim++;
        for(int k=0;k<4;k++)
        {
            v.lin=p.lin+dl[k];
            v.col=p.col+dc[k];
            if(a[v.lin][v.col]==0)
            {
                Q[++ultim]=v;
                a[v.lin][v.col]=a[p.lin][p.col]+1;
            }
        }
    }
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            g<<a[i][j]<<" ";
        g<<"\n";
    }
    g<<a[stopx][stopy]<<"\n";*/
    if(a[stopx][stopy]>=1)
        ret=1;
    return ret;
}
inline void Rezolva(){

    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            b[i][j]--;
    int sol=-1,st=1,dr=n+m;;
    while(st<=dr)
    {
        int m=(st+dr)/2;
        if(Lee(m))
        {
            sol=m;
            st=m+1;
        }
        else
            dr=m-1;
    }
    //g<<Lee(2)<<"\n";
    g<<sol<<"\n";
}
int main()
{
    Citire();
    Bordare();
    Dragon();
    Rezolva();
    return 0;
}