Cod sursa(job #1936245)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 22 martie 2017 22:32:22
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
char m[1002][1002];
int r,c,va[1005][1005],v[1005][1005],da[]={-1,0,1,0},db[]={0,1,0,-1},maxo;
typedef pair<int, int> pij;
queue <pij> qu;
pij st,fi;

void lee(){
    while(!qu.empty()){
        int a=qu.front().first;
        int b=qu.front().second;
        qu.pop();
        for(int k=0;k<=3;++k){
            int nxa=a+da[k];
            int nxb=b+db[k];
            if(nxa<1 || nxb<1 || nxa>r || nxb>c)continue;
            if(m[nxa][nxb]=='D' || m[nxa][nxb]=='*')continue;
            if(v[nxa][nxb])continue;
            v[nxa][nxb]=v[a][b]+1;
            qu.push({nxa,nxb});
        }
    }
}

void lee1(int w){
    for(int i=1;i<=r;++i)
        for(int j=1;j<=c;++j)
            va[i][j]=0;
    if(v[st.first][st.second]>=w){
        qu.push(st);
        va[st.first][st.second]=1;
    }
    while(!qu.empty()){
        int a=qu.front().first;
        int b=qu.front().second;
        qu.pop();
        for(int k=0;k<=3;++k){
            int nxa=a+da[k];
            int nxb=b+db[k];
            if(nxa<1 || nxb<1 || nxa>r || nxb>c)continue;
            if(m[nxa][nxb]=='D' || m[nxa][nxb]=='*')continue;
            if(v[nxa][nxb]<w)continue;
            if(va[nxa][nxb])continue;
            va[nxa][nxb]=1;
            qu.push({nxa,nxb});
        }
    }
}


int main()
{
    fin>>r>>c;
    for(int i=1;i<=r;++i){
        for(int j=1;j<=c;++j){
            fin>>m[i][j];
            if(m[i][j]=='D')
                qu.push({i,j});
            if(m[i][j]=='I')
                st={i,j};
            if(m[i][j]=='O')
                fi={i,j};
        }
    }
    lee();
    int p=1,q=0,m;
    for(int i=1;i<=r;++i)
        for(int j=1;j<=c;++j)
            q=max(q,v[i][j]);
    while(p<=q){
        m=(p+q)/2;
        lee1(m);
        if(va[fi.first][fi.second]){
            maxo=m;
            p=m+1;
        }
        else
            q=m-1;
    }
    fout<<(maxo?maxo:-1)<<'\n';
    return 0;
}