Cod sursa(job #1540995)

Utilizator icepinPredi Dragos icepin Data 3 decembrie 2015 17:23:18
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include<string.h>

#define DIM 1005
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int R,C,a[DIM][DIM],q[2][DIM*DIM],FL,FC,PL,PC,cont,dMax;
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
bool viz[DIM][DIM];
void read()
{
    fin>>R>>C;
    int i,j;
    char x;
    for(i=1;i<=R;i++)
    {
        for(j=1;j<=C;j++)
        {
            fin>>x;
            if(x=='.')
            {
                a[i][j]=0;
                continue;
            }
            if(x=='*')
            {
                a[i][j]=-1;
                viz[i][j]=1;
                continue;
            }
            if(x=='D')
            {
                a[i][j]=0;
                viz[i][j]=1;
                q[0][++cont]=i;
                q[1][cont]=j;
                continue;
            }
            if(x=='I')
            {
                PL=i;
                PC=j;
                continue;
            }
            if(x=='O')
            {
                FL=i;
                FC=j;
                continue;
            }
        }
    }
}
bool inside_mat(int l,int c)
{
    return l>0&&c>0&&l<=R&&c<=C;
}
void Fill()
{
    int p=1,u=cont,x,y,l,c,i;

    while(p<=u)
    {
        x=q[0][p];
        y=q[1][p];
        viz[x][y]=1;
        for(i=0;i<4;i++)
        {
            l=x+dx[i];
            c=y+dy[i];
            if(a[l][c]!=-1&&inside_mat(l,c)&&viz[l][c]==0)
            {
                q[0][++u]=l;
                q[1][u]=c;
                a[l][c]=a[x][y]+1;
                viz[l][c]=1;
                dMax=max(dMax,a[l][c]);
            }
        }
        p++;
    }
}
int verif(int val)
{
    int p,u,x,y,l,c,i;
    memset(viz,0,sizeof(viz));
    p=u=1;
    q[0][p]=PL;
    q[1][p]=PC;
    while(p<=u)
    {
        x=q[0][p];
        y=q[1][p];
        for(i=0;i<4;i++)
        {
            l=x+dx[i];
            c=y+dy[i];
            if(a[l][c]>=val && viz[l][c]==0)
            {
                q[0][++u]=l;
                q[1][u]=c;
                viz[l][c]=1;
            }
        }
        p++;
    }
    return viz[FL][FC];
}
void solve()
{
    int st=1,dr=dMax,mij;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        if(verif(mij))
            st=mij+1;
        else
            dr=mij-1;
    }
    if(st==1)
        st=0;
    fout<<st-1;
}
int main()
{
    read();
    Fill();
    solve();

    return 0;
}