Cod sursa(job #990280)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 27 august 2013 20:37:42
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<cstdio>
#include<cstring>
int v[1001][1001],c[2][1000001],d,n,m,i,j,nmin,u,p,mid,ic,jc,iv,jv,ne,pr,ut,iin,ifin,jin,jfin,ok,viz[1001][1001];
int d1[4]={1,-1,0,0};
int d2[4]={0,0,1,-1};
char x[1001][1001];
FILE *f,*g;
int main(){
    f=fopen("barbar.in","r");
    g=fopen("barbar.out","w");
    fscanf(f,"%d%d\n",&n,&m);
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fscanf(f,"%c",&x[i][j]);
            if(x[i][j]=='D'){
                u++;
                c[0][u]=i;
                c[1][u]=j;
                v[i][j]=01;
            }
            if(x[i][j]=='*')
                v[i][j]=-2;
            if(x[i][j]=='O'){
                v[i][j]=-1;
                ifin=i;
                jfin=j;
            }
            if(x[i][j]=='I'){
                v[i][j]=-1;
                iin=i;
                jin=j;
            }
            if(x[i][j]=='.')
                v[i][j]=-1;
        }
        fscanf(f,"\n");
    }
    p=1;
    while(p<=u){
        ic=c[0][p];
        jc=c[1][p];
        for(d=0;d<=3;d++){
            iv=ic+d1[d];
            jv=jc+d2[d];
            if(v[iv][jv]==-1 && iv>=1 && iv<=n && jv>=1 && jv<=m){
                u++;
                c[0][u]=iv;
                c[1][u]=jv;
                v[iv][jv]=v[ic][jc]+1;
            }
        }
        p++;
    }
    p=0;
    u=m*n;
    while(p<=u){
        mid=(p+u)/2;
        pr=1;
        ut=1;
        c[0][1]=iin;
        c[1][1]=jin;
        ok=0;
        memset(viz,0,sizeof(viz));
        while(pr<=ut && ok==0){
            ic=c[0][pr];
            jc=c[1][pr];
            for(d=0;d<=3;d++){
                iv=ic+d1[d];
                jv=jc+d2[d];
                if(iv>=1 && iv<=n && jv>=1 && jv<=m && viz[iv][jv]==0 && v[iv][jv]>=mid){
                    ut++;
                    c[0][u]=iv;
                    c[1][u]=jv;
                    viz[iv][jv]=1;
                    if(iv==ifin && jv==jfin){
                        ok=1;
                        break;
                    }
                }
            }
            pr++;
        }
        if(ok==1)
            p=mid+1;
        else
            u=mid-1;
    }
    fprintf(g,"%d",u);
    fclose(f);
    fclose(g);
    return 0;
}