Cod sursa(job #720738)

Utilizator ion824Ion Ureche ion824 Data 22 martie 2012 20:54:48
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.92 kb
#include<cstdio>
char a[1005][1005]; 
short l[1005][1005],dr[1005][1005];
int n,m,x1[1005],x2[1005],b1[1005],b2[1005];
bool viz[1005][1005];

inline int maxim(int a,int b){ if(a>b)return a; else return b; }

void readdata(){
    freopen("barbar.in","r",stdin);
    scanf("%d%d\n",&n,&m); 
    for(int i=0;i<n;++i)
              scanf("%s\n",&a[i]);
    fclose(stdin);                                     
     }

int main(void){
    freopen("barbar.out","w",stdout);
    int i,j,p1,p2,p3,p4,kd=0,kk,mx=0,mg=0;
    readdata();
    for(i=0;i<n;++i)
      for(j=0;j<m;++j)
              if(a[i][j]!='.' && a[i][j]!='*')
              {
              if(a[i][j]=='I'){ p1=i; p2=j; }
              if(a[i][j]=='O'){ p3=i; p4=j; }             
              if(a[i][j]=='D'){ 
                                b1[++kd]=i;
                                b2[kd]=j;
                                }                       
              }
    for(i=1;i<=kd;++i)dr[b1[i]][b2[i]]=1; a[p1][p2]='.';        
    while(kd){
              kk=0;
              for(i=1;i<=kd;++i)
              {
                if(!dr[b1[i]+1][b2[i]] && b1[i]+1<n && a[b1[i]+1][b2[i]]=='.')
                   { dr[b1[i]+1][b2[i]]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]+1; x2[kk]=b2[i]; }
                if(!dr[b1[i]-1][b2[i]] && b1[i]-1>-1 && a[b1[i]-1][b2[i]]=='.')
                   { dr[b1[i]-1][b2[i]]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]-1; x2[kk]=b2[i]; }
                if(!dr[b1[i]][b2[i]+1] && b2[i]+1<m && a[b1[i]][b2[i]+1]=='.')
                   { dr[b1[i]][b2[i]+1]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]+1; }
                if(!dr[b1[i]][b2[i]-1] && b2[i]-1>-1 && a[b1[i]][b2[i]-1]=='.')
                   { dr[b1[i]][b2[i]-1]=dr[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]-1; }                                                                               
              }
              kd=kk;
              for(i=1;i<=kd;++i){ b1[i]=x1[i]; b2[i]=x2[i]; }                                                                                                                           
              }
              
   b1[1]=p1; b2[1]=p2; kd=1; l[p1][p2]=1; a[p3][p4]='.';
   while(kd){
           kk=0;
           for(i=1;i<=kd;++i)
           {
             if(a[b1[i]+1][b2[i]]=='.' && !l[b1[i]+1][b2[i]] && b1[i]+1<n)
               { l[b1[i]+1][b2[i]]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]+1; x2[kk]=b2[i];  } 
             if(a[b1[i]-1][b2[i]]=='.' && !l[b1[i]-1][b2[i]] && b1[i]-1>-1)
               { l[b1[i]-1][b2[i]]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]-1; x2[kk]=b2[i];  }             
             if(a[b1[i]][b2[i]+1]=='.' && !l[b1[i]][b2[i]+1] && b2[i]+1<m)
               { l[b1[i]][b2[i]+1]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]+1;  } 
             if(a[b1[i]][b2[i]-1]=='.' && !l[b1[i]][b2[i]-1] && b2[i]-1>-1)                 
               { l[b1[i]][b2[i]-1]=l[b1[i]][b2[i]]+1; x1[++kk]=b1[i]; x2[kk]=b2[i]-1;  }              
           }               
           kd=kk;
           for(i=1;i<=kd;++i){ b1[i]=x1[i]; b2[i]=x2[i]; }                        
             }
              
   i=p3; j=p4; 
   
   while(i!=p1 || j!=p2){  
            mx=0; 
            viz[i][j]=1;
            if(l[i+1][j]==l[i][j]-1 && !viz[i+1][j])mx=maxim(mx,dr[i+1][j]);
            if(l[i-1][j]==l[i][j]-1 && !viz[i-1][j])mx=maxim(mx,dr[i-1][j]);
            if(l[i][j+1]==l[i][j]-1 && !viz[i][j+1])mx=maxim(mx,dr[i][j+1]);
            if(l[i][j-1]==l[i][j]-1 && !viz[i][j-1])mx=maxim(mx,dr[i][j-1]); 
            
            if(dr[i+1][j]==mx && l[i+1][j]==l[i][j]-1)++i;
            if(dr[i-1][j]==mx && l[i-1][j]==l[i][j]-1)--i;
            if(dr[i][j+1]==mx && l[i][j+1]==l[i][j]-1)++j;
            if(dr[i][j-1]==mx && l[i][j-1]==l[i][j]-1)--j;
            
            if(mg==0)mg=mx;
            if(mx<mg)mg=mx;                
               
               }           
     printf("%d",mg);         
 return 0;   
}