Cod sursa(job #419016)

Utilizator s_holmesSherlock Holmes s_holmes Data 16 martie 2010 20:35:58
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <cstdio>
#define RMAX 1005
#define CMAX 1005
#define INF 1000000000
int R , C = 1,D = 0;
int REZ = 0;
int xi, yi, xf, yf;
int dif,st,dr;
bool viz[RMAX][CMAX];
int e[RMAX][CMAX];
struct interval
{
	int x,y;
};
interval coada[RMAX * CMAX];
int lin[5] = {0,-1,0,0,1};
int col[5] = {0,0,-1,1,0};

/*void scrie()
{
	for(int i = 1 ; i <= R ; i++)
	{
		for(int j = 1 ; j <= C ; j++)
			printf("%d ",e[i][j]);
		printf("\n");
	}
	printf("\n\n\n");
			
}*/

void constructie()
{	
	char c;
	scanf("%d %d", &R, &C);
	for(int i = 1 ; i <= R ; i++)
		for(int j = 1 ; j <= C ; j++)
		{
			scanf("%c",&c);
			if(c == '\n')
				scanf("%c",&c);
			if(c == 'D')
			{
				coada[++dr].x = i;
				coada[dr].y = j;
				e[i][j] = 0;
				D++;
				continue;
			}
			if(c == '*')
			{
				e[i][j] = -1;
				continue;
			}
			if(c == 'I')
				xi = i, yi = j;
			if(c == 'O')
				xf = i, yf = j;
			e[i][j] = INF;
		}		
		
}

void BFS()
{
	st=1;
	dr=D;
	while(st <= dr)
	{
		for(int k = 1 ; k <= 4 ; k++)
			if(e[coada[st].x + lin[k]][coada[st].y + col[k]] > e[coada[st].x][coada[st].y] + 1)
			{
				e[coada[st].x + lin[k]][coada[st].y + col[k]] = e[coada[st].x][coada[st].y] + 1;
				coada[++dr].x = coada[st].x + lin[k];
				coada[dr].y = coada[st].y + col[k];
			}
		st++;
	}
}

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

bool C_DRUM(int val)
{
	for(int i = 1 ; i <= R ; i++)
		for(int j = 1 ; j <= C ; j++)
			viz[i][j] = 0;
	st = 1;
	dr = 0;
	if(e[xi][yi] >= val)
	{
		coada[++dr].x = xi;
		coada[dr].y = yi;
		viz[coada[dr].x][coada[dr].y] = 1;
	}
	else
		return 0;
	
	do
	{
		if(coada[st].x == xf && coada[st].y == yf)
			return 1;
		for(int k = 1 ; k <= 4 ; k++)
			if(e[coada[st].x + lin[k]][coada[st].y + col[k]] >= val && !viz[coada[st].x + lin[k]][coada[st].y + col[k]])
			{
				coada[++dr].x = coada[st].x + lin[k];
				coada[dr].y = coada[st].y + col[k];
				viz[coada[dr].x][coada[dr].y] = 1;
			}
		st++;
	}while(st <= dr);
	
	return 0;
}

void caut_bin()
{
	int i;
	for(i = 1 ; i <= R * C ; i <<= 1);
	i >>= 1;
	while(i)
	{
		if(C_DRUM(REZ + i))
			REZ += i;
		i >>= 1;
	}
}

int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	constructie();
	BFS();
	init();
	//scrie();
	caut_bin();
	printf("%d",REZ);
	return 0;
}