Cod sursa(job #2623935)

Utilizator GligarEsterabadeyan Hadi Gligar Data 4 iunie 2020 10:46:57
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <queue>

using namespace std;

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

const int nd=4;
const int dx[nd]={1,-1,0,0}, dy[nd]={0,0,1,-1};
const int nmax=1000,mmax=1000;

int d[nmax+2][mmax+2];
int v[nmax+2][mmax+2];

struct str{
    int x,y;
};

queue <str> q;

str start,finish;

int n,m;

bool bfs(int k){
    if(d[start.x][start.y]<k){
        return 0;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            v[i][j]=0;
        }
    }
    v[start.x][start.y]=1;
    q.push(start);
    while(q.empty()==0){
        int x=q.front().x, y=q.front().y;
        q.pop();
        for(int i=0;i<nd;++i){
            int xn=x+dx[i], yn=y+dy[i];
            if(d[xn][yn]>=k&&v[xn][yn]==0){
                v[xn][yn]=1;
                str aux;
                aux.x=xn;
                aux.y=yn;
                q.push(aux);
            }
        }
    }
    return v[finish.x][finish.y]!=0;
}

int main(){
    fin>>n>>m;
    for(int i=0;i<=n+1;i++){
        d[i][0]=-1;
        d[i][m+1]=-1;
    }
    for(int j=1;j<=m;j++){
        d[0][j]=-1;
        d[n+1][j]=-1;
    }
    for(int i=1;i<=n;++i){
        string z;
        fin>>z;
        for(int j=1;j<=m;j++){
            if(z[j-1]=='*'){
                d[i][j]=-1;
            }else if(z[j-1]=='D'){
                d[i][j]=1;
                str aux;
                aux.x=i;
                aux.y=j;
                q.push(aux);
            }else if(z[j-1]=='I'){
                start.x=i;
                start.y=j;
            }else if(z[j-1]=='O'){
                finish.x=i;
                finish.y=j;
            }
        }
    }
    while(q.empty()==0){
        int x=q.front().x, y=q.front().y;
        q.pop();
        for(int i=0;i<nd;++i){
            int xn=x+dx[i], yn=y+dy[i];
            if(d[xn][yn]==0){
                d[xn][yn]=d[x][y]+1;
                str aux;
                aux.x=xn;
                aux.y=yn;
                q.push(aux);
            }
        }
    }
    int nm2=1;
    while(nm2<=n*m){
        nm2*=2;
    }
    nm2/=2;
    int sol=0;
    for(int i=nm2;i>0;i/=2){
        if(sol+i<=n*m&&bfs(sol+i)==1){
            sol+=i;
        }
    }
    fout<<sol-1<<"\n";
    return 0;
}