Cod sursa(job #1249234)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 26 octombrie 2014 18:23:11
Problema Barbar Scor 100
Compilator c Status done
Runda alexvs.razvan1 Marime 2.57 kb
#include <stdio.h>
#define NIL -1
#define MAXN 1000
#define NRDIR 4
int dirlin[NRDIR]=
{
    -1, 0, 1, 0
};
int dircol[NRDIR]=
{
    0, 1, 0, -1
};
int m[MAXN+2][MAXN+2], ok[MAXN+2][MAXN+2], coadaL[MAXN*MAXN], coadaC[MAXN*MAXN], nrlin, nrcol, st, dr, l1, l2, c1, c2;
inline void bordare(){
    int i;
    for(i=0; i<=nrlin+1; i++){
        m[i][0]=NIL;
        m[i][nrcol+1]=NIL;
    }
    for(i=0; i<=nrcol+1; i++){
        m[0][i]=NIL;
        m[nrlin+1][i]=NIL;
    }
}
inline void calc_dist(){
    int l, c, x, i;
    while(st<dr){
        l=coadaL[st];
        c=coadaC[st++];
        x=m[l][c]+1;
        if(x==0){
            x++;
        }
        for(i=0; i<NRDIR; i++){
            if(m[l+dirlin[i]][c+dircol[i]]==0){
                m[l+dirlin[i]][c+dircol[i]]=x;
                coadaL[dr]=l+dirlin[i];
                coadaC[dr++]=c+dircol[i];
            }
        }
    }
}
inline int posibil(int dist){
    int i, j, l, c, lin, col;
    for(i=1; i<=nrlin; i++){
        for(j=1; j<=nrcol; j++){
            ok[i][j]=0;
        }
    }
    coadaL[0]=l1;
    coadaC[0]=c1;
    ok[l1][c1]=1;
    st=0;
    dr=1;
    while((st<dr)&&(ok[l2][c2]==0)){
        l=coadaL[st];
        c=coadaC[st++];
        for(i=0; i<NRDIR; i++){
            lin=l+dirlin[i];
            col=c+dircol[i];
            if((ok[lin][col]==0)&&(m[lin][col]>=dist)){
                ok[lin][col]=1;
                coadaL[dr]=lin;
                coadaC[dr++]=col;
            }
        }
    }
    return ok[l2][c2];
}
int main(){
    int i, j, rez, pas;
    char ch;
    FILE *fin, *fout;
    fin=fopen("barbar.in", "r");
    fout=fopen("barbar.out", "w");
    fscanf(fin, "%d%d ", &nrlin, &nrcol);
    st=0;
    dr=0;
    for(i=1; i<=nrlin; i++){
        for(j=1; j<=nrcol; j++){
            ch=fgetc(fin);
            if(ch=='*'){
                m[i][j]=NIL;
            }else if(ch=='D'){
                m[i][j]=NIL;
                coadaL[dr]=i;
                coadaC[dr++]=j;
            }else if(ch=='I'){
                l1=i;
                c1=j;
            }else if(ch=='O'){
                l2=i;
                c2=j;
            }
        }
        fgetc(fin);
    }
    bordare();
    calc_dist();
    rez=0;
    for(pas=1<<9; pas!=0; pas>>=1){
        if((rez+pas<=m[l1][c1])&&(rez+pas<=m[l2][c2])&&(posibil(rez+pas)==1)){
            rez+=pas;
        }
    }
    if(rez==0){
        fprintf(fout, "-1\n");
    }else{
        fprintf(fout, "%d\n", rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}