Cod sursa(job #343464)

Utilizator rumburakrumburak rumburak Data 25 august 2009 22:29:44
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<cstdio>

struct poz
{
	int lin,col;
};

const int N = (1<<10);
const int dlin[]={-1,0,1,0};
const int dcol[]={0,1,0,-1};

char a[N][N];
int d[N][N],r,c;
poz q[N*N],st,fi; 

void citire()
{
	int i;
	scanf("%d%d\n",&r,&c);
	for(i=1 ; i<=r ; ++i)
		fgets(1+a[i],N,stdin);
}

void CL_dragoni()
{
	int i,j,k,p=1,u=0;
	poz x,y;
	for(i=1 ; i<=r ; ++i)
		for(j=1 ; j<=c ; ++j)
		{
			d[i][j]=N;
			if(a[i][j]=='I')
				st=(poz){i,j};
			if(a[i][j]=='O')
				fi=(poz){i,j};
			if(a[i][j]=='D')
			{
				d[i][j]=0;
				q[++u]=(poz){i,j};
			}
		}
	while(p<=u)
	{
		x=q[p++];
		for(k=0 ; k<4 ; ++k)
		{
			y=(poz){x.lin+dlin[k],x.col+dcol[k]};
			i=y.lin;
			j=y.col;
			if((a[i][j]=='.' || a[i][j]=='I' || a[i][j]=='O') && d[i][j]==N)
			{
				d[i][j]=1+d[x.lin][x.col];
				q[++u]=(poz){i,j};
			}
		}
	}
}

bool CL(int val)
{
	bool b[N][N]={false};
	int i,j,k,p=1,u=0;
	poz x,y;
	if(d[st.lin][st.col]<val)
		return false;
	b[st.lin][st.col]=true;
	q[++u]=(poz){st.lin,st.col};
	while(p<=u)
	{
		x=q[p++];
		for(k=0 ; k<4 ; ++k)
		{
			y=(poz){x.lin+dlin[k],x.col+dcol[k]};
			i=y.lin;
			j=y.col;
			if((a[i][j]=='.' || a[i][j]=='O') && !b[i][j] && d[i][j]>=val)
			{
				b[i][j]=true;
				q[++u]=(poz){i,j};
			}
		}
	}
	return b[fi.lin][fi.col];
}

int caut()
{
	int i,pas=N>>1;
	for(i=0 ; pas ; pas>>=1)
		if(i+pas<=r && i+pas<=c && CL(i+pas))
			i+=pas;
	return (i ? i : -1);
}

int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	citire();
	CL_dragoni();
	printf("%d\n",caut());
	return 0;
}