Cod sursa(job #1223667)

Utilizator horatiu11Ilie Ovidiu Horatiu horatiu11 Data 28 august 2014 15:58:43
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
//horatiu11
# include <cstdio>
# include <queue>
# include <algorithm>
# include <cstring>
# define nmax 1003
# define inf 2000000000
using namespace std;
int a[nmax][nmax],d[nmax][nmax],n,m,li,ci,lf,cf,M,l,r;
bool matrix[nmax][nmax];
char ch;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct cel{int l,c;}x,y;
queue <cel>q;
inline void lee()
{
    int i,lv,cv;
    while(!q.empty())
    {
        x=q.front();q.pop();
        for(i=0;i<4;++i)
        {
            lv=x.l+dx[i];cv=x.c+dy[i];
            if(a[lv][cv]!=-1 && d[lv][cv]>d[x.l][x.c]+1 && lv>0 && lv<=n && cv>0 && cv<=m)
            {
                d[lv][cv]=d[x.l][x.c]+1;
                M=max(M,d[lv][cv]);
                y.l=lv;y.c=cv;q.push(y);
            }
        }
    }
}
inline bool verif(int val)
{
    int i,lv,cv;
    if(d[li][ci]<val)return false;
    memset(matrix,false,sizeof(matrix));
    matrix[li][ci]=true;
    x.l=li;x.c=ci;q.push(x);
    while(!q.empty())
    {
        x=q.front();q.pop();
        for(i=0;i<4;++i)
        {
            lv=x.l+dx[i];cv=x.c+dy[i];
            if(d[lv][cv]>=val && a[lv][cv]!=-1 && !matrix[lv][cv] && lv>0 && lv<=n && cv>0 && cv<=m)
            {
                matrix[lv][cv]=true;
                y.l=lv;y.c=cv;
                q.push(y);
            }
        }
    }
    return matrix[lf][cf];
}
int main()
{
    int i,j,mij;
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d%c",&n,&m,&ch);
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
        {
            d[i][j]=inf;
            scanf("%c",&ch);
            if(ch=='I')li=i,ci=j,a[i][j]=2;
            else if(ch=='O')lf=i,cf=j,a[i][j]=3;
            else if(ch=='*')a[i][j]=-1;
            else if(ch=='D')
            {
                a[i][j]=1;
                d[i][j]=0;
                x.l=i;x.c=j;
                q.push(x);
            }
        }
        scanf("%c",&ch);
    }
    lee();
    l=0;r=M;
    while(l<=r)
    {
        mij=(l+r)/2;
        if(verif(mij)==true)l=mij+1;
        else r=mij-1;
    }
    if(r>M || r<0)printf("-1\n");
    else printf("%d\n",r);
    return 0;
}