Cod sursa(job #2358271)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 27 februarie 2019 23:00:50
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.19 kb
#include <iostream>
#include <cstdio>
using namespace std;

int n,m;

inline int verif(int x, int y)
{
    return (x<=n && x>=1) && (y<=m && y>=1);
}
inline int mini(int a, int b)
{
    if(a<b)
        return a;
    return b;
}
int mat[1003][1003],minime[1003][1003],ql[1000*1000+3],qc[1000*1000+3],dl[4]={0,0,1,-1},dc[4]={1,-1,0,0},b[1003][1003];

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j,si,sj,fi,fj,l,c,first,last,maxim=-1,st,dr,poz=-1,mij;
    char a;
    //cin>>n>>m;
    scanf("%d %d", &n, &m);
    for(i=0;i<=n+1;i++)
        mat[i][0]=mat[i][m+1]=b[i][0]=b[i][m+1]=-1;
    for(j=0;j<=m+1;j++)
        mat[0][j]=mat[n+1][j]=b[0][j]=b[n+1][j]=-1;
    a=getchar();
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            minime[i][j]=1000*1000+1231;
            a=getchar();
            if(a=='D')
                mat[i][j]=-2;
            else if(a=='I')
            {
                si=i;
                sj=j;
            }
            else if(a=='O')
            {
                fi=i;
                fj=j;
            }
            else if(a!='.')
                mat[i][j]=-1;
        }
        a=getchar();
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            if(mat[i][j]==-2)
            {
                first=1;
                last=1;
                ql[1]=i;
                qc[1]=j;
                minime[i][j]=0;
                while(first<=last)
                {
                    l=ql[first];
                    c=qc[first];
                    for(int k=0;k<=3;k++)
                    {
                        if(verif(l+dl[k],c+dc[k]) && minime[l][c]+1<minime[l+dl[k]][c+dc[k]] && mat[l+dl[k]][c+dc[k]]==0)
                        {
                            last++;
                            ql[last]=l+dl[k];
                            qc[last]=c+dc[k];
                            minime[l+dl[k]][c+dc[k]]=minime[l][c]+1;
                        }
                    }
                    first++;
                }

            }
    }
    st=1;
    dr=mini(minime[fi][fj],minime[si][sj]);
    while(st<=dr)
    {
        mij=(st+dr)/2;
        first=last=1;
        b[si][sj]=1;
        ql[1]=si;
        qc[1]=sj;
        while(first<=last && b[fi][fj]==0)
        {
            l=ql[first];
            c=qc[first];
            for(int k=0;k<=3;k++)
            {
                if(verif(l+dl[k],c+dc[k]) && minime[l+dl[k]][c+dc[k]]>=mij && b[l+dl[k]][c+dc[k]]==0 && mat[l+dl[k]][c+dc[k]]==0)
                {
                    last++;
                    ql[last]=l+dl[k];
                    qc[last]=c+dc[k];
                    b[l+dl[k]][c+dc[k]]=b[l][c]+1;
                }
            }
            first++;
        }
        if(b[fi][fj]!=0)
        {
            poz=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                b[i][j]=0;
        for(i=0;i<=n+1;i++)
            b[i][0]=b[i][m+1]=-1;
        for(j=0;j<=m+1;j++)
            b[0][j]=b[n+1][j]=-1;
    }
    cout<<poz;

    return 0;
}