Cod sursa(job #2527826)

Utilizator eugen5092eugen barbulescu eugen5092 Data 20 ianuarie 2020 21:42:57
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream ci("barbar.in");
ofstream cou("barbar.out");
struct coord
{
    int x,y;
};
coord fin,intr;
int n,m,v[1001][1001],dragoni[1001][1001],lee[1001][1001];
short coordx[5]= {-1,0,1,0};
short coordy[5]= {0,1,0,-1};
queue<coord>drg;
queue<coord>q;

void citire()
{
    ci>>n>>m;
    int i,j;
    char a;
    coord w;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
        {
            ci>>a;
            if(a=='.')
            {
                v[i][j]=0;
            }
            if(a=='I' )
            {
                w.x=i;
                w.y=j;
                intr=w;
                q.push(w);
                v[i][j]=1;
            }
            if(a=='D' ){
               w.x=i;
               w.y=j;
               drg.push(w);
               v[i][j]=1;
            }
            if(a=='*' ){
                v[i][j]=1;
            }
            if(a=='O' ){
                fin.x=i;
                fin.y=j;
            }


            }
    }

}
bool Ok(int i,int j){
if(i>=1&&j>=1&&i<=n&&j<=m){
    return 1;
}
return 0;
}


void Leedragoni(){
coord w,w1;
while(!drg.empty()){
    w=drg.front();
    drg.pop();

    for(int i=0;i<=3;i++){
        w1.x=w.x+coordx[i];
        w1.y=w.y+coordy[i];
        if(Ok(w1.x,w1.y)){
            if(dragoni[w1.x][w1.y]==0||dragoni[w1.x][w1.y]>dragoni[w.x][w.y]+1 ){
                drg.push(w1);
                dragoni[w1.x][w1.y]=dragoni[w.x][w.y]+1;
            }
        }

    }


}



}

void Lee(int k){
int i,j;
for(i=1;i<=n;i++){
    for(j=1;j<=m;j++){
        lee[i][j]=0;
    }
}


coord w,w1;
while(!q.empty()){
        w=q.front();
    q.pop();
        if(dragoni[w.x][w.y]<k ){
            return;
        }


    for(int i=0;i<=3;i++){
        w1.x=w.x+coordx[i];
        w1.y=w.y+coordy[i];
        if(Ok(w1.x,w1.y)){
            if(dragoni[w1.x][w1.y]>=k ){
                if(v[w1.x][w1.y]!=1 ){
                    if(lee[w1.x][w1.y]==0||lee[w1.x][w1.y]!=1 ){
                        q.push(w1);
                        lee[w1.x][w1.y]=1;
                    }
                }

            }
        }

    }


}


}

void rez(){
int st=1,dr=n*m+3;
int mij;
int i,j,veri=0,sol;

while(st<=dr){

    mij=(st+dr)/2;
    q.push(intr);
    Lee(mij);

    if(lee[fin.x][fin.y]==0 ){
        dr=mij-1;
    }else{
    st=mij+1;
        veri=1;
        sol=mij;
    }
}


if(veri==0){
    Lee(1);
        if(lee[fin.x][fin.y]!=0 ){
        cou<<1;
    }else{
    cou<<-1;
    }
}else{
    Lee(sol-1);
    if(lee[fin.x][fin.y]!=0 ){
        cou<<sol-1;
    }else{
    cou<<sol;
    }

}




}



int main()
{
    int i,j;
    citire();
    Leedragoni();


    rez();
    return 0;
}