Cod sursa(job #2288843)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 24 noiembrie 2018 00:09:42
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int x1,y1,x2,y2,n,m,a[1005][1005];
int x[1000005],y[1000005],s=1,d;
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
char c[1005][1005];
int succes(int k){
    memset(c,0,sizeof(c));
    s=d=1;
    x[1]=x1; y[1]=y1;
    c[x1][y1]=1;
    while(s<=d){
        for(int i=0;i<4;i++){
            int xx=x[s]+dx[i],yy=y[s]+dy[i];
            if(!c[xx][yy] && a[xx][yy]>=k){
                if(xx==x2 && yy==y2) return 1;
                c[xx][yy]=1;
                ++d;
                x[d]=xx; y[d]=yy;
            }
        }
        ++s;
    }
    return 0;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>(c[i]+1);
    for(int i=0;i<=n+1;i++) a[i][0]=a[i][m+1]=-1;
    for(int i=0;i<=m+1;i++) a[0][i]=a[n+1][i]=-1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(c[i][j]=='I'){
                x1=i; y1=j;
            }
            else if(c[i][j]=='O'){
                x2=i; y2=j;
            }
            else if(c[i][j]=='D'){
                a[i][j]=1;
                ++d;
                x[d]=i; y[d]=j;
            }
    while(s<=d){
        for(int i=0;i<4;i++){
            int xx=x[s]+dx[i],yy=y[s]+dy[i];
            if(!a[xx][yy]){
                a[xx][yy]=a[x[s]][y[s]]+1;
                ++d;
                x[d]=xx; y[d]=yy;
            }
        }
        ++s;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            if(c[i][j]=='*')
                a[i][j]=0;
            --a[i][j];
        }
    int st=1,dr=n;
    while(dr-st>1){
        int mid=(st+dr)>>1;
        if(succes(mid)) st=mid;
        else dr=mid;
    }
    cout<<st;
}