Cod sursa(job #119552)

Utilizator mithyPopovici Adrian mithy Data 1 ianuarie 2008 21:40:31
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <fstream>
#define NMax 1005
#define ND 4
#define ZID -1
#define INF 32000

int in, sf;
int dx[] = { -1, 0, 1, 0 };
int dy[] = {  0, 1, 0,-1 };
struct point{ int x, y; } C[NMax*NMax], aux;

int n, m;
int a[NMax][NMax];
int b[NMax][NMax];
point start, stop;

std::ifstream f( "barbar.in" );
std::ofstream g( "barbar.out" );

void citire();
void rez();
int lee( int mij );

int main()
{
	citire();
	rez();
	return 0;
}
int lee( int mij )
{
	int i, j;
	in = sf = 0;
	C[in] = start;

	for (i=0; i<=n+1; i++)
	for (j=0; j<=m+1; j++)
		if ( a[i][j] != ZID )
			b[i][j] = 0;
		else 
			b[i][j] = 1;

	b[start.x][start.y] = 1;

	while ( in <= sf )
	{
		aux = C[in++];

		if ( aux.x == stop.x && aux.y == stop.y && a[aux.x][aux.y] >= mij )
			return 1;

		for (i=0; i<ND; i++)
			if ( a[aux.x+dx[i]][aux.y+dy[i]] >= mij &&
				 a[aux.x+dx[i]][aux.y+dy[i]] != ZID &&
				 b[aux.x+dx[i]][aux.y+dy[i]] == 0 )
			{
				sf++;
				C[sf].x = aux.x+dx[i];
				C[sf].y = aux.y+dy[i];
				b[aux.x+dx[i]][aux.y+dy[i]] = 1;
			}
	}
	return 0;
}
void rez()
{
	int i, st, dr, mij, ok, min = -1;

	while ( in <= sf )
	{
		aux = C[in++];
		for (i=0; i<ND; i++)
			if ( a[aux.x+dx[i]][aux.y+dy[i]] > 1 + a[aux.x][aux.y] && a[aux.x+dx[i]][aux.y+dy[i]] != ZID )
			{
				a[aux.x+dx[i]][aux.y+dy[i]] = 1 + a[aux.x][aux.y];
				sf++;
				C[sf].x = aux.x+dx[i];
				C[sf].y = aux.y+dy[i];
			}
	}

	st = 0; dr = 1000;
  	while ( st <= dr )
  	{
  		mij = (st+dr)/2;
  		ok  = lee( mij );
  		if ( !ok )
  		{
  			dr = mij;
  		}		
  		else
  		{
			min = mij;
  			st = mij;
  		}
		if ( st == dr-1 )
			break;
  	}
	g << min << '\n';
}
void citire()
{
	int i, j;
	char aux[NMax];

	f >> n >> m ;
	for (i=1; i<=n; i++)
	for (j=1; j<=m; j++)
		a[i][j] = INF;

	f.get();

	for (i=1; i<=n; i++)
	{
		f.getline( aux, NMax, '\n' );
		for (j=1; j<=m; j++)
		switch ( aux[j-1] )
		{
			case 'I':
				start.x = i; start.y = j;
			break;
			case 'O':
				stop.x = i; stop.y = j;
			break;
			case 'D':
				C[sf].x = i; C[sf].y = j; 
				a[i][j] = 0;
				sf++;
			break;
			case '*':
				a[i][j] = ZID;
			break;
		}
	}
	sf--;

	for (i=0; i<=n+1; i++)
		a[i][0] = a[i][m+1] = ZID;
	for (j=0; j<=m+1; j++)
		a[0][j] = a[n+1][j] = ZID;
}