Cod sursa(job #467563)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 29 iunie 2010 13:52:01
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<stdio.h>
#include<string>

FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");

int min ( int a, int b ){
	if ( a > b )
		return b;
	return a;
}

int n,m,b[1005][1005],i,j,ii,xfin,yfin,xinit,yinit,p,u,mij;
char a[1005][1005];
int c[2][1005*1005];

int di[4] = {1,-1,0,0};
int dj[4] = {0,0,1,-1};


int coada ( int x ) {
	int p,u,ic,jc,iv,jv;
	int d;
	char viz[1005][1005];
	memset(viz,0,sizeof(viz));
	
	c[0][1] = xinit; c[1][1] = yinit;
	
	p = u = 1 ;
	
	
	while ( p <= u ){
		
		ic = c[0][p]; jc = c[1][p];
		
		for ( d = 0 ; d <= 3 ; ++d ){
			
			iv = ic + di[d]; jv = jc + dj[d];
			
			if( iv >= 1 && iv <= n && jv >= 1 && jv <= m && viz[iv][jv] == 0 && a[iv][jv] == '.'  && (b[iv][jv] == 2000 || b[iv][jv] <= x ) ){
				
				++u ;
				c[0][u] = iv ; c[1][u] = jv ;
				viz[iv][jv] = 1 ;
				
				if ( iv == xfin && jv == yfin && (b[iv][jv] == 2000 || b[iv][jv] <= x ) )
					return 1;
				
			}
			
		}
		
		++p;
		
	}
	
	return 0;
	
	
}



int main () {
	
	fscanf(f,"%d %d\n",&n,&m);
	
	for ( i = 1 ; i <= n ; ++i )
		for ( j = 1 ; j <= m ; ++j )
			b[i][j] = 2000 ;
	
	for ( i = 1 ; i <= n ; ++i ){
		fscanf( f,"%s",a[i] + 1 ) ;
		for ( j = 1 ; j <= m ; ++j ){
			if ( a[i][j] == 'I' ){
				xinit = i ; yinit = j ;
				continue;
			}
			if ( a[i][j] == 'D' ){
				
				for ( ii = i ; ii <= n ; ++ii )
					b[ii][j] = min ( b[ii][j] , ii - i ) ;
				for ( ii = i ; ii >= 1 ; ii -- )
					b[ii][j] = min ( b[ii][j] , i - ii ) ;
				for ( ii = j ; ii <= m ; ii ++ )
					b[i][ii] = min ( b[i][ii] , ii - j ) ;
				for ( ii = j ; ii >= 1 ; ii -- )
					b[i][ii] = min ( b[i][ii] , j - ii ) ;
				
				continue; 
			}
			if ( a[i][j] == 'O' )
				xfin = i ; yfin = j ;
		}
	}
	
	
	p = 1 ; 
	
	if ( n > m )
		u = n ;
	else
		u = m ;
	
	while ( p <= u ){
		
		mij = p + (u - p ) / 2 ;
		
		// coada(x) == 1 daca poate traversa trecand doar cu distanta <= x 
		
		if ( coada(mij) == 1 )
			u = mij - 1 ;
		else
			p = mij + 1 ;
		
		
	}
	
	
	if( u == 0 )
		fprintf( g, "-1\n" ) ; 
	else
		fprintf(g,"%d\n",u);
	
	
	fclose(f);
	fclose(g);
	return 0;
}