Cod sursa(job #509610)

Utilizator drujbarultudorTudor Mihai Munteanu drujbarultudor Data 11 decembrie 2010 14:42:06
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>

const int N=1002;

struct elem
{
	int lin,col;
};
elem c[N*N];
int il,ic,fl,fc,q,m,j,n,i,p,u;
int a[N][N],v[N][N];
char b[N][N];
const int dlin[]={-1,0,1,0};
const int dcol[]={0,1,0,-1};
void scrie()
{
	for (i=1;i<=n;i++)
	{
		for (j=1;j<=n;j++)
			printf("%5d ",a[i][j]);
		printf("\n");
	}
	//printf("\n");
}
void lee ()
{
    elem xn;
	p = 1;
	while (p<=u)
	{
		for (i=0;i<4;i++)
		{
			xn.lin=c[p].lin+dlin[i];
			xn.col=c[p].col+dcol[i];
			if (a[xn.lin][xn.col]==-1)
			{
				c[++u]=xn;
				a[xn.lin][xn.col]=1+a[c[p].lin][c[p].col];
			}
		}
		++p;
	}
}
bool drum (int dist)
{
	elem xn;
	int p=1,u=0;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			v[i][j]=-1;
	c[++u].lin = il;
	c[u].col = ic;
	if(a[il][ic]<dist)
		return false;
	v[il][ic] = 0;
	while (p<=u)
	{
		for (i=0;i<4;i++)
		{
			xn.lin=c[p].lin+dlin[i];
			xn.col=c[p].col+dcol[i];
			if (a[xn.lin][xn.col]>=dist && v[xn.lin][xn.col] == -1)
			{
				c[++u]=xn;
				v[xn.lin][xn.col]=1+v[c[p].lin][c[p].col];
				if(xn.lin==fl && xn.col == fc)
					return true;
			}
		}
		++p;
	}
	return false;
}
int caut()
{
	int i,pas=1<<11;
	for (i=0;pas!=0;pas/=2)
		if (drum(i+pas))
			i+=pas;
		return i;
}
int main ()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	for (i=1;i<=n;i++)
		gets(b[i]+1);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			if (b[i][j]=='.') 
			{
				a[i][j]=-1;
				v[i][j]=-1;
			}
			if (b[i][j]=='*')
			{ 
				a[i][j]=-2;
				v[i][j]=-2;
			}
				
				if (b[i][j]=='I')
				{					
					a[i][j]=-1;
					v[i][j]=0;
					il=i;
					ic=j;
				}
				if (b[i][j]=='O')
				{					
					a[i][j]=-1;
					v[i][j]=-1;
					fl=i;
					fc=j;
				}
				if (b[i][j]=='D') 
				{
						a[i][j]=0;
						v[i][j]=-2;
						u++;
						c[u].lin=i;
						c[u].col=j;
				}
		}
	for (i=1;i<=n;i++)
	{
		a[i][0]=-2;
		a[i][m+1]=-2;
		v[i][0]=-2;
		v[i][m+1]=-2;
	}
	for (j=1;j<=m;j++)
	{
		a[0][j]=-2;
		a[n+1][j]=-2;
		v[0][j]=-2;
		v[n+1][j]=-2;
	}
	//scrie();
	lee();
	//scrie();
	q=caut();
	if (q==0) printf("-1");
	else printf("%d",q);
	return 0;
}