Cod sursa(job #1826708)

Utilizator AnaRaduAna-Maria Radu AnaRadu Data 10 decembrie 2016 19:40:02
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>
#define lim 1005
int mat[lim][lim],d[lim][lim];
int l[4]={-1,0,1,0},c[4]={0,1,0,-1};
struct elem{int x,y;};
elem q[lim*lim];
int n,m,xi,yi,xf,yf,val,st,dr;
void bordare(){
    int i,j;
    for(i=0;i<=n+1;i++){
        mat[i][0]=-1;
        mat[i][m+1]=-1;
    }
    for(j=0;j<=m+1;j++){
        mat[0][j]=-1;
        mat[n+1][j]=-1;
    }
}
void fill(int i,int j){
    int k,ii,jj;
    d[i][j]=1;
    for(k=0;k<4;k++){
        ii=i+l[k];
        jj=j+c[k];
        if(mat[ii][jj]>=val&&d[ii][jj]==0)
            fill(ii,jj);
    }
}
void lee(int st,int dr){
    int i,j,ii,jj,k;
    while(st<=dr){
        i=q[st].x;
        j=q[st].y;
        for(k=0;k<4;k++){
            ii=i+l[k];
            jj=j+c[k];
            if(mat[ii][jj]==0){
                mat[ii][jj]=mat[i][j]+1;
                dr++;
                q[dr].x=ii;
                q[dr].y=jj;
            }
        }
        st++;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(mat[i][j]!=-1)
                mat[i][j]-=1;
}
bool drum(int dist){
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            d[i][j]=0;
    val=dist;
    if(mat[xi][yi]>=val)
        fill(xi,yi);
    if(d[xf][yf]!=0)
        return true;
    else
        return false;
}
int main(){
    FILE *fin,*fout;
    fin=fopen("barbar.in","r");
    fout=fopen("barbar.out","w");
    int i,j,mij,rasp;
    char ch;
    fscanf(fin,"%d%d\n",&n,&m);
    bordare();
    st=0;
    dr=-1;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fscanf(fin,"%c",&ch);
            if(ch=='*')
                mat[i][j]=-1;
            if(ch=='D'){
                dr++;
                q[dr].x=i;
                q[dr].y=j;
                mat[i][j]=1;
            }
            if(ch=='I'){
                xi=i;
                yi=j;
            }
            if(ch=='O'){
                xf=i;
                yf=j;
            }
        }
        fscanf(fin,"%c",&ch);
    }
    lee(st,dr);
    st=0;
    dr=n*m;
    rasp=-1;
    while(st<=dr){
        mij=(st+dr)/2;
        if(drum(mij)==true){
            rasp=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    fprintf(fout,"%d",rasp);
    fclose(fin);
    fclose(fout);
    return 0;
}