Cod sursa(job #1656784)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 19 martie 2016 19:43:27
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#define MAXN 1000
char mat[MAXN+2][MAXN+2];
int cl[MAXN*MAXN],cc[MAXN*MAXN],lung[MAXN+2][MAXN+2],drum[MAXN+2][MAXN+2];
int dl[]={-1,0,0,1},dc[]={0,-1,1,0},n,m;
inline int cauta(int d,int l1,int c1,int l2,int c2){
     int b,e,i,j,l,c;
     for(i=1;i<=n;i++)
       for(j=1;j<=m;j++)
          drum[i][j]=0;
     cl[0]=l1;
     cc[0]=c1;
     drum[l1][c1]=1;
     b=0;
     e=1;
     do{
        for(i=0;i<4;i++){
           l=dl[i]+cl[b];
           c=dc[i]+cc[b];
           if(lung[l][c]>=d&&mat[l][c]!='*'&&drum[l][c]==0){
              drum[l][c]=drum[cl[b]][cc[b]]+1;
              cl[e]=l;
              cc[e]=c;
              e++;
           }
        }
        b++;
     }while(b<e&&drum[l2][c2]==0);
     if(drum[l2][c2]>0)
        return 1;
     return 0;
}
int main(){
    FILE*fi,*fout;
    int i,j,b,e,l1,c1,l2,c2,l,c,rez,pas;
    fi=fopen("barbar.in" ,"r");
    fout=fopen("barbar.out" ,"w");
    fscanf(fi,"%d%d " ,&n,&m);
    b=e=0;
    for(i=1;i<=n;i++){
       for(j=1;j<=m;j++){
          fscanf(fi,"%c" ,&mat[i][j]);
          if(mat[i][j]=='D'){
              cl[e]=i;
              cc[e]=j;
              lung[i][j]=1;
              e++;
          }
          if(mat[i][j]=='I'){
              l1=i;
              c1=j;
          }
          if(mat[i][j]=='O'){
              l2=i;
              c2=j;
          }
       }
       fscanf(fi,"\n");
    }
    for(i=0;i<=n+1;i++)
       mat[i][0]=mat[i][m+1]='*';
    for(i=0;i<=m+1;i++)
       mat[0][i]=mat[n+1][i]='*';
    do{
        for(i=0;i<4;i++){
           l=cl[b]+dl[i];
           c=cc[b]+dc[i];
           if(mat[l][c]!='*'&&lung[l][c]==0){
               lung[l][c]=lung[cl[b]][cc[b]]+1;
               cl[e]=l;
               cc[e]=c;
               e++;
           }
        }
        b++;
    }while(b<e);
    rez=0;
    for(pas=1<<15;pas;pas>>=1)
       if(lung[l1][c1]>=rez+pas&&cauta(rez+pas,l1,c1,l2,c2)==1)
          rez+=pas;
    fprintf(fout,"%d" ,rez-1);
    fclose(fi);
    fclose(fout);
    return 0;
}