Cod sursa(job #316559)

Utilizator drag0s93Mandu Dragos drag0s93 Data 19 mai 2009 23:17:10
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include<cstdio>
#include<vector>

using namespace std;

#define IN "barbar.in","r",stdin
#define OUT "barbar.out","w",stdout
#define Nmax 1050
#define PII pair<int,int>
#define x first
#define y second

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

int R , C  , E = 0 , sfx , sfy ;
int maxim = - 2000000;
int ix , iy ;
int MAT[Nmax][Nmax] , M[Nmax][Nmax];
PII coada[Nmax];

void MAT_make()
{
	int nx , ny ;
	for(int i = 1 ; i <= E ; ++i)
		for(int k = 0 ; k <= 3 ; ++k)
		{
			nx = coada[i].x + dx[k];
			ny = coada[i].y + dy[k];
			if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && (MAT[nx][ny] != -1 || MAT[nx][ny] != -4 || MAT[nx][ny] || MAT[nx][ny] != -3))
			{
				if(MAT[coada[i].x][coada[i].y] + 1 < MAT[nx][ny] && MAT[nx][ny] != -2)
				{
					MAT[nx][ny] = MAT[coada[i].x][coada[i].y] + 1;
					coada[++E].x = nx;
					coada[E].y = ny;
				}
				else if(MAT[nx][ny] == -2)
				{
					MAT[nx][ny] = MAT[coada[i].x][coada[i].y] + 1;
					coada[++E].x = nx;
					coada[E].y = ny;
				}
				if(MAT[nx][ny] > maxim)	maxim = MAT[nx][ny];
			}
		}
	for(int i = 1 ; i <= R ; ++i)
	{
		for(int j = 1 ; j <= C ; ++j)	printf("  %d  ",MAT[i][j]);
		printf("\n");
	}
}
int verific(int m)
{
	int nx , ny;
	
	for(int i = 1 ; i <= R ; ++i)
		for(int j = 1 ; j <= C ; ++j)	M[i][j] = 0;
	for(int i = 1 ; i <= E ; ++i)	{coada[i].x = 0 ; coada[i].y = 0;}
	coada[1].x = ix;
	coada[1].y = iy;
	for(int i = 1 ; i <= E ; ++i)
 		for(int k = 0 ; k <= 3 ; ++k)
		{
			nx = coada[i].x + dx[k];
			ny = coada[i].y + dy[k];
			if(nx == sfx && ny == sfy)	return 1;
			if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && MAT[nx][ny] >= m && M[nx][ny] == 0 )
			{
				coada[++E].x = nx;
				M[nx][ny] = 1;
				coada[E].y = ny;
			}
		}
	return 0;
}
int main()
{
	freopen(IN);
	freopen(OUT);
	scanf("%d%d\n",&R,&C);
	char ch;
	for(int i = 1 ; i <= R ; ++i)
	{
		for(int j = 1 ; j <= C ; ++j)
		{
			scanf("%c",&ch);
			if(ch == 'D')
			{
				coada[++E].x = i;
				coada[E].y = j;
				MAT[i][j] = 0;
			}
			if(ch == 'I')	{MAT[i][j] = -1;ix = i;iy = j;}
			if(ch == '.')	MAT[i][j] = -2;
			if(ch == 'O')	{MAT[i][j] = -3;sfx = i ; sfy = j;}
			if(ch == '*')	MAT[i][j] = -4;
		}
		scanf("\n");
	}
	MAT_make();
	for(int i = 1 ; i <= E ; ++i)	{coada[i].x = 0 ; coada[i].y = 0;}
	coada[1].x = ix;
	coada[1].y = iy;
	E  = 1 ;
	int st = 0 , dr = maxim , m , sol = -2000000;
	while(st <= dr)
	{
		m = (st + dr) / 2;
		if(verific(m) == 1)	{dr = m - 1 ; sol = m;}
		else st = m + 1;
	}
	if(sol == -2000000)	{printf("-1");return 0;}
	printf("%d\n",sol);
	return 0;
}