Cod sursa(job #896337)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2013 15:11:49
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.03 kb
#include<cstdio>
#include<cstring>
  
#define BIG 1<<30
#define MAX_SIZE 1005
#define GOOD 3
#define min(a,b) ((a)<(b)?(a):(b))
  
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
  
using namespace std;
  
  
int a[MAX_SIZE][MAX_SIZE],l_dr[1000000],c_dr[1000000];
int b[MAX_SIZE][MAX_SIZE];
int start_i,start_j;
bool viz[MAX_SIZE][MAX_SIZE];
int dx[]={-1,1,0,0},dy[]={0,0,1,-1};
int N,M,pos1,pos2;
char ch;
int result;
int q;
  
  
  
  
void read  ( void )
{
    fscanf(f,"%d%d",&N,&M);
        fscanf(f,"%c",&ch);
    for( int i(1); i <= N; ++i )
    {
        for( int ii(1); ii <= M ; ++ii)
        {
            fscanf(f,"%c",&ch);
            b[i][ii]=BIG;
            if(ch=='.')
             continue;
             if(ch == 'I' )
             {
                 a[i][ii]=1;
                 start_i=i;
                 start_j=ii;
                 continue;
             }          
             if(ch == '*' )
             {
                 a[i][ii]=BIG;
                 continue;
             }
             if(ch == 'D' )
             {
                 a[i][ii]=2;
                 b[i][ii]=0;
                 l_dr[++q]=i;
                 c_dr[q]=ii;
             }
             if(ch == 'O' )
             {
                  a[i][ii]=3;
                   
             }
        } 
            fscanf(f,"%c",&ch);
              
        }
      
      
      
      
      
      
  
}
inline void mod ( void )
{
          
      for(int i=0;i<=N+1;i++)
    {
        a[i][0]=a[i][M+1]=BIG;
        b[i][0]=b[i][M+1]=0;
    }
    for(int i=0;i<=M+1;i++)
    {
        a[0][i]=a[N+1][i]=BIG;
        b[0][i]=b[N+1][i]=0;
    }
                  
          
  
      
      
      
      
}
void bfs( void )
{
      
      
  
    int x,y,xnou,ynou;
      
      
     for(int i(1); i <= q; ++i)
     {
         x=l_dr[i];
         y=c_dr[i];
           
           
         for(int ii(0); ii <= 3; ++ii )
         {
             xnou=x+dx[ii];
             ynou=y+dy[ii];
               
             if( a[xnou][ynou]!=BIG &&  b[x][y]+1 < b[xnou][ynou]  )
             {
                 b[xnou][ynou]=b[x][y]+1;
                 q++;
                 l_dr[q]=xnou;
                 c_dr[q]=ynou;
                   
                   
             }
               
               
          
               
               
         }
           
           
          
           
           
     }
      
      
      
      
}
  
int bfs2( int m  )
{
    int k=1;
      
    memset(viz,0,sizeof(viz));
    l_dr[1]=start_i;
    c_dr[1]=start_j;
	if(b[start_i][start_j] < m)
		return 0;
    viz[l_dr[1]][c_dr[1]]=1;
    int x,y,xnou,ynou;
    for(int i(1); i <= k; ++i )
    {
        x=l_dr[i];
        y=c_dr[i];
          
        for(int ii(0); ii <= 3; ++ii)
        {
            xnou=x+dx[ii];
            ynou=y+dy[ii];
            if(viz[xnou][ynou] == 0 && a[xnou][ynou]!=BIG && b[xnou][ynou] >= m)
            {
                  
                  
                viz[xnou][ynou]=1;
                ++k;
                l_dr[k]=xnou;
                c_dr[k]=ynou;
                if(a[xnou][ynou] == 3 )
                    return 1;           
                  
            }           
        }       
    }
      
    return 0;
      
}
  
void solve ( void )
{
    int left=0,right=1000000;
      
    while( left <= right )
    {
        int mid=(left+right)/2;
          
        if( bfs2(mid)  ==  1  )
        {
            result=mid;
            left=mid+1;
            continue;
        }
        right=mid-1;
          
          
          
          
          
    }
      
      
      
}
inline void write( void )
{
    if(result == 0)
        fprintf(g,"-1");
 
        else
    fprintf(g,"%d",result);
    fclose(g);
      
      
}
  
int main()
{
    read();
    mod();
    bfs();
    solve();
    write();
    return 0;   
}