Cod sursa(job #183073)

Utilizator hadesgamesTache Alexandru hadesgames Data 21 aprilie 2008 18:09:27
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <stdio.h>
struct ceva 
{
	int x,y;
};
ceva coada[10000005];
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
bool a[1005][1005];
int b[1005][1005],c[1005][1005],n,m,x1,x2,y2,y1;
char s[1030]; 
int ver(int x,int y)
{
	if (x<1||x>n)
		return 0;
	if (y<1||y>m)
		return 0;
	return 1;
}
int exista(int x)
{
	int p=1,u=1,i,u2,j;
	coada[1].x=x1;
	coada[1].y=y1;	
	while (p<=u)
	{
		u2=u;
		for (i=p;i<=u;i++)
		{
			for (j=0;j<4;j++)
			if (ver(coada[i].x+dx[j],coada[i].y+dy[j])&&c[coada[i].x+dx[j]][coada[i].y+dy[j]]!=x&&a[coada[i].x+dx[j]][coada[i].y+dy[j]]!=1&&b[coada[i].x+dx[j]][coada[i].y+dy[j]]>=x)
			{
				if (x2==coada[i].x+dx[j]&&y2==coada[i].y+dy[j])
					return 1;
				u2++;
				coada[u2].x=coada[i].x+dx[j];
				coada[u2].y=coada[i].y+dy[j];
				c[coada[i].x+dx[j]][coada[i].y+dy[j]]=x;
			}
		}
		p=u+1;
		u=u2;
	
	}
	//fprintf(stdout,"%d %d\n",n,m);
/*	if (x==1)
	{
		for (i=1;i<=u;i++)
			fprintf(stdout,"(%d,%d)  ",coada[i].x,coada[i].y);
		fprintf(stdout,"\n");
			for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
			fprintf(stdout,"%d ",b[i][j]);
		fprintf(stdout,"\n");
	}
		for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
			fprintf(stdout,"%d ",c[i][j]);
		fprintf(stdout,"\n");
	}
	}*/
	return 0;
}
int main()
{
	FILE *in,*out;
	int p,u,u2,i,j,m2;
	in=fopen("barbar.in","r");
	out=fopen("barbar.out","w");
	fscanf(in,"%d%d\n",&n,&m);
	p=1;
	u=0;
	for (i=1;i<=n;i++)
	{
		fgets(s+1,m+10,in);
		for (j=1;j<=m;j++)
		{
			if (s[j]=='I')
			{
				x1=i;
				y1=j;
			}	
			if (s[j]=='O')
			{
				x2=i;
				y2=j;
			}
			if (s[j]=='*')
			{
				a[i][j]=1;
			}
			if (s[j]=='D')
			{
				u++;
				coada[u].x=i;
				coada[u].y=j;				
				a[i][j]=2;
			}	
		}
	}
	while (p<=u)
	{
		u2=u;
		for (i=p;i<=u;i++)
		{
			for (j=0;j<4;j++)
			if (ver(coada[i].x+dx[j],coada[i].y+dy[j])&&!b[coada[i].x+dx[j]][coada[i].y+dy[j]]&&!a[coada[i].x+dx[j]][coada[i].y+dy[j]])
			{
				b[coada[i].x+dx[j]][coada[i].y+dy[j]]=b[coada[i].x][coada[i].y]+1;
				u2++;
				coada[u2].x=coada[i].x+dx[j];
				coada[u2].y=coada[i].y+dy[j];
			}
		}
		p=u+1;
		u=u2;
	}
/*	for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
			fprintf(stdout,"%d ",b[i][j]);
		fprintf(stdout,"\n");
	}*/
	p=0;
	u=m*n+2;
	while (p<u)
	{
		m2=(p+u)/2;
		if (exista(m2))
		{
			p=m2;
		//	fprintf(stdout,"p=%d\n",p);
		}
		else
		{
			u=m2-1;
	//		fprintf(stdout,"u=%d\n",u);
		}
	}
//	fprintf(stdout,"%d\n",p);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			c[i][j]=-2;
			
	if (exista(p))
		fprintf(out,"%d\n",p);
	else
		fprintf(out,"-1\n");
	fclose(in);
	fclose(out);
	return 0;
}