Cod sursa(job #896212)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2013 14:24:22
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.13 kb
#include<cstdio>
#include<cstring>

#define BIG 1<<30
#define MAX_SIZE 1005
#define GOOD -2
#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[1005];
int result;
int q;




void read  ( void )
{
	fscanf(f,"%d%d",&N,&M);
		fscanf(f,"%c",&ch);
	for( int i(1); i <= N; ++i )
	{
		
		
			fscanf(f,"%s",&ch);
			for(int ii(0) ; ch[ii];++ii)
			{
		    if(ch[ii]=='.')
             continue;
             if(ch[ii] == 'I' )
			 {
				
				 start_i=i;
				 start_j=ii;
				 continue;
			 }			
             if(ch[ii] == '*' )
			 {
				 a[i][ii]=-BIG;
				 continue;
			 }
			 if(ch[ii] == 'D' )
			 {
				
				 b[i][ii]=0;
				 l_dr[++q]=i;
				 c_dr[q]=ii;
			 }
			 if(ch[ii] == 'O' )
			 {
				  a[i][ii]=GOOD;
				 
			 }
		} 
			
			
	}
	
	
	
	
	
	

}
inline void mod ( void )
{
		 int i,j;
    for(i=0;i<=N+1;i++)
        {
            b[i][0]=-1;
                
            b[i][M+1]=-1;  
             a[i][0]=-BIG;
                
            a[i][M+1]=-BIG;   
           
        }
        for(j=0;j<=M+1;j++)
            {
               
               b[0][j]=-1;
                b[N+1][j]=-1;
				a[0][j]=-BIG;
                a[N+1][j]=-BIG;
                    
        }
        a[0][0]=-BIG;
                
        

	
	
	
	
}
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[xnou][ynou] == 0 || b[x][y]+1 <= b[xnou][ynou]  &&  b[xnou][ynou]!=-1&& 1<= xnou &&xnou <=N && 1<= ynou && ynou<=M)
			 {
				 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;
	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] == GOOD )
					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;	
}