Cod sursa(job #1340432)

Utilizator avaspAva Spataru avasp Data 11 februarie 2015 20:08:31
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include<cstdio>
using namespace std;
int a[1001][1001],cate,li,ci,lf,cf;
bool mat[1001][1001];
struct blabla{int lin, col;};
blabla coada[1000001],str;
int l[5]={-1,0,1,0},c[5]={0,1,0,-1},n,m;
int NRMAX;
void umplere(){
    int ic,sf,lnou,cnou;
    ic=1;
    sf=cate;
    while(ic<=sf){
        for(int i=0;i<=3;i++){
            lnou=coada[ic].lin+l[i];
            cnou=coada[ic].col+c[i];
            if(lnou>0&&lnou<=n&&cnou>0&&cnou<=m)
            if(a[lnou][cnou]!=-1&&(a[lnou][cnou]>a[coada[ic].lin][coada[ic].col]+1||a[lnou][cnou]==0)){
                a[lnou][cnou]=a[coada[ic].lin][coada[ic].col]+1;
                if(a[lnou][cnou]>NRMAX)
                    NRMAX=a[lnou][cnou];
                sf++;
                coada[sf].lin=lnou;
                coada[sf].col=cnou;
            }
        }
        ic++;
    }
    cate=sf;
}

bool valid(int k){
    int maxim=0,ic,sf,lnou,cnou;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            mat[i][j]=false;
        }
    for(int i=1;i<=cate;i++){
        coada[i].lin=0;
        coada[i].col=0;
    }
    ic=1;
    sf=1;
    coada[1].lin=li;
    coada[1].col=ci;
    if(a[li][ci]>maxim)
        maxim=a[li][ci];
    if(a[li][ci]<k)
        return false;
    while(ic<=sf){
        for(int i=0;i<=3;i++){
            lnou=coada[ic].lin+l[i];
            cnou=coada[ic].col+c[i];
            if(lnou>0&&lnou<=n&&cnou>0&&cnou<=m)
            if(a[lnou][cnou]!=-1&&(a[lnou][cnou]>=k)&&mat[lnou][cnou]==false){
                mat[lnou][cnou]=true;
                sf++;
                coada[sf].lin=lnou;
                coada[sf].col=cnou;
            }
        }
        ic++;
    }
    return mat[lf][cf];
}



int main(){
    char c;
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%c",&c);
            if(c=='I'){
                li=i;
                ci=j;
            }
            else
            if(c=='D'){
                a[i][j]=1;
                str.lin=i;
                str.col=j;
                //coada.push_back(str);
                cate++;
                coada[cate]=str;
            }
            else
            if(c=='O'){
                lf=i;
                cf=j;
            }
            else
            if(c=='*')
                a[i][j]=-1;
        }
        scanf("\n");
    }
    umplere();
    int l1,l2,ret,mij;
    l1=1;
    l2=NRMAX;
    ret=-1;
    while(l1<=l2){
        mij=(l1+l2)/2;
        if(valid(mij)==true){
            l1=mij+1;
            ret=mij;
        }
        else
            l2=mij-1;
    }
    printf("%d",ret-1);

    return 0;
}