Cod sursa(job #418994)

Utilizator s_holmesSherlock Holmes s_holmes Data 16 martie 2010 19:59:43
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.21 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;
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++;
	}
}

bool C_DRUM(int val)
{
	int viz[RMAX][CMAX] = {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();
	scrie();
	BFS();
	scrie();
	caut_bin();
	printf("%d",REZ + 1);
	return 0;
}