Cod sursa(job #2364294)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 3 martie 2019 23:19:11
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <iostream>
#define dim 1010
#define x first
#define y second
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

long long n,m,i,j,d[dim][dim],is,js,it,jt,st,dr,mid,cnt;
char s;
pair<int,int> c[dim*dim];
int p,u;
bool a[dim][dim];
bool v[dim][dim];

int D;
int di[]={-1,0,0,1};
int dj[]={0,-1,1,0};
int ic,jc,iv,jv;

int main(){
    fin>>n>>m;

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            fin>>s;
            if(s=='I')
                is=i,js=j;
            if(s=='D'){
                c[++u]=make_pair(i,j);
                d[i][j]=1;
            }
            if(s=='*')
                a[i][j]=1;
            if(s=='O')
                it=i,jt=j;
        }

    p=1;
    while(p<=u){
        ic=c[p].x; jc=c[p].y;
        for(D=0;D<4;D++){
            iv=ic+di[D]; jv=jc+dj[D];

            if(iv>0 && jv>0 && iv<=n && jv<=m){
                if(!d[iv][jv] && !a[iv][jv]){
                    d[iv][jv]=d[ic][jc]+1;
                    c[++u]=make_pair(iv,jv);
                }
            }
        }

        p++;
    }

    st=1; dr=d[c[u].x][c[u].y];
    while(st<=dr){
        mid=(dr+st)/2;

        p=1; u=1;
        c[u]=make_pair(is,js);
        v[is][js]=1;

        while(p<=u && !v[it][jt]){
            ic=c[p].x; jc=c[p].y;
            for(D=0;D<4;D++){
                iv=ic+di[D]; jv=jc+dj[D];

                if(iv>0 && jv>0 && iv<=n && jv<=m){
                    if(d[iv][jv]>=mid && !v[iv][jv]){
                        v[iv][jv]=1;
                        c[++u]=make_pair(iv,jv);
                    }
                }
            }

            p++;
        }

        if(v[it][jt])
            st=mid+1;
        else
            dr=mid-1;

        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                v[i][j]=0;
    }

    st=0;
    fout<<max(dr-1,st);

    return 0;
}