Cod sursa(job #317157)

Utilizator drag0s93Mandu Dragos drag0s93 Data 22 mai 2009 19:08:12
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include<cstdio>
#include<vector>
#include<string.h>

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
#define LL long long

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

int R , C  , E = 0 , sfx , sfy ;
int ix , iy ;
LL maxim = -2000000000;
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] != -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] == -1))
				{
					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 p = 1 ; p <= R ; ++p)
		for(int t = 1 ; t <= C ; ++t)
			M[p][t] = 0;
	//memset(M , 0 , C*R);
	M[ix][iy] = 1;
	for(int i = 1 ; i <= E ; ++i)	{
		coada[i].x = 0 ; 
		coada[i].y = 0;
	}
	E = 1;
	coada[1].x = ix;
	coada[1].y = iy;
	/*
	for(int p = 1 ; p <= R ; ++p)
	{
		for(int t = 1 ; t <= C ; ++t)
			printf("  %d  ",M[p][t]);
		printf("\n");
	}*/
	//printf("%d %d %d\n",E , coada[1].x , coada[1].y);
	M[ix][iy] = 1;
	if(MAT[ix][iy] < m)	return 0;
	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(MAT[nx][ny] == -3)	return 1;
			if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && MAT[nx][ny] >= m && M[nx][ny] == 0 && (MAT[nx][ny] != 0 || MAT[nx][ny] != -4))
			{
				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 <= R ; ++i)
	{
		for(int j = 1 ; j<= C; ++j)
			printf("%d ",MAT[i][j]);
		printf("\n");
	}
	*/
	int st = 0  , m , sol = -2000000;
	LL dr = -200000000;
	while(st <= dr)
	{
		m = (st + dr) / 2;
		//printf("%d \n",verific(m));
		if(verific(m) == 1)	{st = m + 1 ; sol = m;}
		else dr = m - 1;
		/*
		printf("->%d ",m);
		for(int i = 1; i <= R ; ++i)
		{
			for(int j = 1; j <= C ; ++j)
				printf("%d ",M[i][j]);
			printf("\n");
		}
		printf("\n");
		*/
	}
	if(sol == -2000000)	{printf("-1");return 0;}
	printf("%d\n",sol);
	return 0;
}