Cod sursa(job #2120384)

Utilizator adiaioanaAdia R. adiaioana Data 2 februarie 2018 13:24:52
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <fstream>
#define NM 1000
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int mx,st,dr,mj,a[NM+10][NM+10],l[NM+10][NM+10],t[NM+10][NM+10],m,k,xc,yc,xf,yf,mark,n,ax,ay,ok;
int dx[5]={0,-1,0,1,0};
int dy[5]={0,0,1,0,-1};
struct chestie{
int x,y;
}c[NM*NM+10],p1,p2;
void scan();
void bord();
void dragoni();
bool lee(int nr);
void init();
int main()
{
    scan();
    bord();
    dragoni();
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            fout<<t[i][j]<<' ';
        fout<<'\n';
    }*/
    st=1;dr=NM*NM;mx=-1;
    while(st<=dr)
    {
        mj=(st+dr)/2;
        init();
        if(lee(mj)==1)
        {
            ok=lee(mj);
            mx=mj;
            st=mj+1;
        }
        else dr=mj-1;
    }
    fout<<mx<<'\n';
    return 0;
}
void init()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            l[i][j]=0;
}
bool lee(int nr)
{
    int ul=1,pr=1;
    l[xc][yc]=1;
    c[ul].x=xc;
    c[ul].y=yc;
    if(t[xc][yc]<nr)
        return 0;
    while(pr<=ul)
    {
        p1=c[pr];
        mark=l[p1.x][p1.y];
        pr++;
        for(int i=1;i<=4;i++)
        {
            p2.x=p1.x+dx[i];
            p2.y=p1.y+dy[i];
            if(a[p2.x][p2.y]==0&&t[p2.x][p2.y]>=nr&&l[p2.x][p2.y]==0)
            {
                c[++ul]=p2;
                l[p2.x][p2.y]=mark+1;
            }
        }
    }
    if(l[xf][yf]!=0)
        return 1;
    return 0;
}
void bord()
{
    for(int i=0;i<=n+1;i++)
        a[i][0]=a[i][m+1]=1;
    for(int j=0;j<=m+1;j++)
        a[0][j]=a[n+1][j]=1;
}
void dragoni()
{
    int pr=1;
    while(pr<=k)
    {
        p1.x=c[pr].x;p1.y=c[pr].y;
        mark=t[p1.x][p1.y];
        pr++;
        for(int i=1;i<=4;i++)
        {
            ax=p1.x+dx[i];
            ay=p1.y+dy[i];
            if(a[ax][ay]==0&&t[ax][ay]==0){
                t[ax][ay]=mark+1;
                c[++k].x=ax;
                c[k].y=ay;
            }
        }
    }
}
void scan()
{
    char ch;
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin.get();
        for(int j=1;j<=m;j++)
        {
            fin>>ch;
            switch(ch)
            {
            case '.': a[i][j]=0; break;
            case '*': a[i][j]=1; break;
            case 'D': c[++k].x=i,c[k].y=j,a[i][j]=1; break;
            case 'I': xc=i,yc=j; break;
            case 'O': xf=i,yf=j; break;
            }
        }
    }
}