Cod sursa(job #2778940)

Utilizator flaviaelenaflavia tufan flaviaelena Data 2 octombrie 2021 13:32:49
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <queue>
#include <stack>
#include <cstring>

using namespace std;
const int nmax=1005;
char a[nmax][nmax];
int viz[nmax][nmax];
int d[nmax][nmax],b[nmax][nmax];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct point{
    int x,y;
};
queue <point> q;
stack <point> s;
int n,m;
point st,fn;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
void fill(int x,int y,int k){
    int nx,ny,i;
    viz[x][y]=1;
    for(i=0;i<4;++i){
        nx=x+dx[i];
        ny=y+dy[i];
        if(viz[nx][ny]==0 && d[nx][ny]>=k){
            fill(nx,ny,k);
        }
    }
}
int valid(int k){
    memset(viz,0,sizeof(viz));
    fill(st.x,st.y,k);
    if(viz[fn.x][fn.y]==1){
        return 1;
    }
    return 0;
}
int bs(){
    int st=1,dr=n+m,mij,last;
    while(st<=dr){
        mij=(st+dr)/2;
        if(valid(mij)==1){
            last=mij;
            st=mij+1;
        } else {
            dr=mij-1;
        }
    }
    return last;
}
int main()
{
    int i,j;
    point nou,aux;
    fin>>n>>m;
    for(i=1;i<=n;++i){
        fin>>a[i]+1;
        for(j=1;j<=m;++j){
            if(a[i][j]=='.'){
                b[i][j]=0;
            } else if(a[i][j]=='D'){
                b[i][j]=2;
                aux.x=i;
                aux.y=j;
                viz[i][j]=1;
                q.push(aux);
                d[i][j]=0;
            } else if(a[i][j]=='I'){
                st.x=i;
                st.y=j;
            } else if(a[i][j]=='O'){
                fn.x=i;
                fn.y=j;
            } else if(a[i][j]=='*'){
                b[i][j]=1;
                d[i][j]=0;
            }
        }
    }
    for(i=0;i<=n;++i){
        b[i][0]=b[i][m+1]=1;
    }
    for(j=0;j<=m;++j){
        b[0][j]=b[n+1][j]=1;
    }

    while(!q.empty()){
        aux=q.front();
        q.pop();
        for(i=0;i<4;++i){
            nou.x=aux.x+dx[i];
            nou.y=aux.y+dy[i];
            if(!viz[nou.x][nou.y] && b[nou.x][nou.y]==0){
                q.push(nou);
                viz[nou.x][nou.y]=1;
                d[nou.x][nou.y]=d[aux.x][aux.y]+1;
            }
        }
    }
    fout<<bs();

    return 0;
}