Cod sursa(job #328374)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 1 iulie 2009 20:27:17
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <cstdio>
#define DIM 1003
int dl[4]={-1,0,1,0};
int dc[4]={0,-1,0,1};
int n,j,ix,sw,iy,mx,mi,ac,bc,my,p,u,nn,m[DIM][DIM],b[DIM][DIM],i,il,ll;
char a[DIM];
struct coada{ int l,c;} c[DIM*DIM],x,y;
using namespace std;

void bordare()
{//bordez ambele matrici
   for(i=0; i<=n; ++i)  { b[i][0]=b[i][nn+1]=m[i][0]=m[i][nn+1]=-2;}
   for(i=0; i<=nn; ++i) { b[n+1][i]=b[0][i]=m[n+1][i]=m[0][i]=-2;}

}
int bfs()
{
   p=1;
   while(p<=u)
        {
            x=c[p++];
            for(i=0; i<4; ++i)
               {
                  y.l=x.l+dl[i];
                  y.c=x.c+dc[i];
                  if(m[y.l][y.c]==0)
                    {
                       m[y.l][y.c]=m[x.l][x.c]+1;
                       c[++u]=y;
                    }
               }
        }

}
int bfs2( int k )
{   
    sw=0;
    p=u=0;
    x.l=ix; x.c=iy;
    b[x.l][x.c]=1;
    c[p]=x;
        while( p<=u )
         {
                x=c[p++];
                for(il=0; il<4; ++il)
                   {
                         y.l=x.l+dl[il];
                         y.c=x.c+dc[il];
                         if( b[y.l][y.c]==0 )
                           {
                                if( m[y.l][y.c]>=k ) //verific proprietatea
                                {
                                b[y.l][y.c]=b[x.l][x.c]+1;
                                c[++u]=y;
                                }
                                else b[y.l][y.c]=-2;//cel care nu are il elimin                          
                                
                           }
                   }
                   
         }
if(b[mx][my]>0) sw=1;
for(il=1; il<=n; ++il) //golire();
           for(ll=1; ll<=nn; ++ll) 
               b[il][ll]=0;                 
return sw;
}                               
int bsearch()
{
    
    for(i=1, j=n*nn, mi=i+(j-i)/2; i<=j; mi=i+(j-i)/2)
       {    
            ac=bfs2(mi);
            bc=bfs2(mi+1);
            if( ac && !bc ) return mi; //perfect :>
            else
            if( ac ) i=mi+1; //bigger
            else
            j=mi-1; //smaller
            
       }
return 0;
}    
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&nn);
    for(i=1; i<=n; ++i)
       {
       scanf("%s\n",&a);
       for(j=0;j<nn;++j)
          if(a[j]=='D') { x.l=i; x.c=j+1;m[x.l][x.c]=1; c[++u]=x;}
          else
          if(a[j]=='*') {m[i][j+1]=-2;}
          else
          if(a[j]=='I') {ix=i;iy=j+1;}
          else
          if(a[j]=='O') {mx=i;my=j+1;}
       }
bordare();
bfs();
printf("%d\n" ,bsearch()-1 );
return 0;
}