Cod sursa(job #414641)

Utilizator DeadEyeNaiba Mihai Lucian DeadEye Data 10 martie 2010 12:41:48
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include<cstdio>
int sf,m,n,pf1,pf2,px[1002][1002],p[1002][1002],dl[1002],dc[1002];
char a[1002][1002];
struct point
{
	int lz,cz;
};
point cc[1<<20];
int max(int x,int y)
{
	if(x>y)
		return x;
	return y;
}
int l1()
{
	int i,j,nr=0;
	point x,y;
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			if(a[i][j]=='D')
			{
				cc[nr].lz=i;
				cc[nr].cz=j;
				nr++;
			}
	for(i=0;i<nr;i++)
	{
		x.lz=cc[i].lz;
		x.cz=cc[i].cz;
		dl[0]=1;
		dl[1]=0;
		dl[2]=-1;
		dl[3]=0;
		dc[0]=0;
		dc[1]=1;
		dc[2]=0;
		dc[3]=-1;
		for(j=0;j<4;j++)
			if(p[x.lz+dl[j]][x.cz+dc[j]]==0 && a[x.lz+dl[j]][x.cz+dc[j]]!='*' && a[x.lz+dl[j]][x.cz+dc[j]]!='D')
			{
				y.lz=x.lz+dl[j];
				y.cz=x.cz+dc[j];
				p[y.lz][y.cz]=p[x.lz][x.cz]+1;
				cc[nr]=y;
				nr++;
			}
	}
	return 0;
}
int l2(int nub)
{
	int i,j,nr=0;
	point x,y;
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			if(a[i][j]=='I')
			{
				cc[nr].lz=i;
				cc[nr].cz=j;
				nr++;
			}
	for(i=0;i<nr;i++)
	{
		x.lz=cc[i].lz;
		x.cz=cc[i].cz;
		dl[0]=1;
		dl[1]=0;
		dl[2]=-1;
		dl[3]=0;
		dc[0]=0;
		dc[1]=1;
		dc[2]=0;
		dc[3]=-1;
		for(j=0;j<4;j++)
			if(px[x.lz+dl[j]][x.cz+dc[j]]==0 && a[x.lz+dl[j]][x.cz+dc[j]]!='*' && a[x.lz+dl[j]][x.cz+dc[j]]!='D' && p[x.lz+dl[j]][x.cz+dc[j]]>=nub)
			{
				y.lz=x.lz+dl[j];
				y.cz=x.cz+dc[j];
				px[y.lz][y.cz]=px[x.lz][x.cz]+1;
				cc[nr]=y;
				nr++;
			}
	}
	if(px[pf1][pf2]!=0)
	{
		printf("%d\n",nub);
		return 0;
	}
	return 0;
}
int cb()
{
	int i=0,pas=1<<11;
	int cheap=max(m,n);
	for(i=0;pas;pas>>=1)
		if(l2(i+pas))
			i+=pas;
	return i;
}
int main()
{
	int i,j,nn;
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d\n",&m,&n);
	for(i=1;i<=m;i++)
		gets(a[i]+1);
	for(i=0;i<=m+1;i++)
	{
		a[i][0]='*';
		a[i][n+1]='*';
	}
	for(j=0;j<=n+1;j++)
	{
		a[0][j]='*';
		a[m+1][j]='*';
	}
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			if(a[i][j]=='O')
			{
				pf1=i;
				pf2=j;
			}
	l1();
	sf=max(m,n);
	for(nn=sf;nn>=1;nn--)
	{
		l2(nn);
		if(px[pf1][pf2]!=0)
			return 0;
		for(i=1;i<=m;i++)
			for(j=1;j<=n;j++)
				px[i][j]=0;
	}
	printf("-1\n");
	return 0;
}