Cod sursa(job #76393)

Utilizator ioliPopa Iolanda ioli Data 9 august 2007 17:23:53
Problema Barbar Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.53 kb
#include <stdio.h>
#define DIM 1001

int R, C, temn[ DIM ][ DIM ], viz[ DIM ][ DIM ];
int coada[ DIM * DIM ][ 2 ], dimc;

int startx, starty, stopx, stopy;

void readinput( void )
{
	int i, j;
	char ch;

	FILE *in = fopen( "barbar.in" , "rt" );
	fscanf( in, "%d%d\n", &R, &C);
	for( i = 0; i < R; i++ )
	{
		for( j = 0; j < C; j++ )
		{
			fscanf( in, "%c", &ch );
			switch ( ch ) {
				case '.': temn[ i ][ j ] = 0; break;
				case '*': temn[ i ][ j ] = -2; break;
				case 'D': {
						coada[ dimc   ][ 0 ] = i;
						coada[ dimc++ ][ 1 ] = j;
						temn[ i ][ j ] = -1;
					  } break;
				case 'I': {
						startx = i;
						starty = j;
						temn[ i ][ j ] = 0;
					  } break;
				case 'O': {
						stopx = i;
						stopy = j;
						temn[ i ][ j ] = 0;
					  }
			}
		}
		fscanf( in, "\n" );
        }

	fclose( in );
}

const int dx[ 4 ] = {  0, 0, -1, 1 },
	  dy[ 4 ] = { -1, 1,  0, 0 };

int maxd, mind = 5 * DIM;

void bf( void )
{
	int i = 0, j = dimc, k, x, y;

	while( i < j )
	{
		x = coada[ i ][ 0 ];
		y = coada[ i ][ 1 ];
		for( k = 0; k < 4; k++ )
			if( x + dx[k] >= 0 && x + dx[k] < R &&
			    y + dy[k] >= 0 && y + dy[k] < C &&
			    !temn[ x + dx[k] ][ y + dy[k] ] )
			{
				if( i < dimc )
					temn[ x + dx[k] ][ y + dy[k] ] = 1;
				else
					temn[ x + dx[k] ][ y + dy[k] ] = temn[ x ][ y ] + 1;
				coada[ j   ][ 0 ] = x + dx[k];
				coada[ j++ ][ 1 ] = y + dy[k];
			}
		i++;
	}
}

void clearviz( void )
{
	int i, j;
	for( i = 0; i < R; i++ )
		for( j = 0; j < C; j++ )
			viz[ i ][ j ] = 0;
}

int dfs( int kx, int ky, int bord )
{
	int k;

	if( kx == stopx && ky == stopy ) return 1;
	viz[ kx ][ ky ] = 1;
	for( k = 0; k < 4; k++ )
		if( kx + dx[k] >= 0 && kx + dx[k] < R &&
		    ky + dy[k] >= 0 && ky + dy[k] < C &&
		    !viz[ kx + dx[k] ][ ky + dy[k] ] &&
		    temn[ kx + dx[k] ][ ky + dy[k] ] >= bord )
			if( dfs( kx + dx[k], ky + dy[k], bord ) )
				return 1;
	return 0;
}

int rez = -2;

void go( void )
{
	mind = -1;
	maxd = temn[ startx ][ starty ];

	while( mind <= maxd )
	{
		clearviz();
		if( dfs( startx, starty, ( mind + maxd ) / 2 ) )
			{
				rez = ( mind + maxd ) / 2;
				mind = ( mind + maxd ) / 2 + 1;
			}
		else    maxd = ( mind + maxd ) / 2 - 1;
	}

	if( rez == -1 ) rez = 0;
	else
		if( rez == -2 ) rez = -1;
}

void writeoutput( void )
{
	FILE *out = fopen( "barbar.out", "wt" );
	fprintf( out, "%d", rez );
	fclose( out );
}

int main()
{
	readinput();
	bf();
	go();
	writeoutput();
	return 0;
}