Cod sursa(job #183314)

Utilizator hadesgamesTache Alexandru hadesgames Data 21 aprilie 2008 22:16:15
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.59 kb
#include <stdio.h>
struct ceva 
{
	int x,y;
};
ceva coada[1000005];
char aux;
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
int a[1005][1005],ver2[1000005];
int b[1005][1005],c[1005][1005],n,m,x1,x2,y2,y1,step;
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;	
	if (b[x1][y1]<x||b[x2][y2]<x)
		return 0;
	/*if (x==0)
				for (i=1;i<=n;i++)
	{
		for (j=1;j<=m;j++)
			fprintf(stdout,"%d ",a[i][j]);
		fprintf(stdout,"\n");
	}*/
	c[x1][y1]=x;
	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])
					{
			//			fprintf(stdout,"1 %d\n",x);
						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;
				}
		//		if (x==0&&coada[i].x+dx[j]==2&&coada[i].y+dy[j]==5)
			//		fprintf(stdout,"%d %d %d %d\n",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);
			}
		}
		p=u+1;
		u=u2;
	
	}
	//fprintf(stdout,"%d %d\n",n,m);
	/*if (x==0)
	{
		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");
	}*/
	//fprintf(stdout,"0 %d\n",x);
	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);
		//fprintf(stdout,"%d:%s",i,s+1);
		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 (a[2][5]==1)
		//			fprintf(stdout,"%s\nBravo ma !\n",s+1);
			}
			if (s[j]=='D')
			{
				u++;
				coada[u].x=i;
				coada[u].y=j;				
				a[i][j]=2;
				//if (a[i][j]==1)
				//{
				//	fprintf(stdout,"%s\nBravo ma !!!!!%d %d\n",s,i,j);
			//	}
			}	
			//if (a[i][j]==1)
				//	fprintf(stdout,"%s\nBravo ma !\n",s+1);
		}
	}
	a[2][5]=2;
//	fprintf(stdout,"%d\n",a[2][5]);
	//fprintf(stdout,"Initial:%d \n");
	//for (i=1;i<=n;i++)
	//{
	//	for (j=1;j<=m;j++)
	//		fprintf(stdout,"%d ",a[i][j]);
	//	fprintf(stdout,"\n");
	//}
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			c[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=b[x1][y1]+2;
	while (p<=u)
	{
		m2=(p+u)/2;
		if (exista(m2)||ver2[m2])
		{
			ver2[m2]=1;
			p=m2+1;
		}
		else
		{
			u=m2-1;
			if (exista(u)||ver2[u])
			{
				fprintf(out,"%d\n",u);
				fclose(in);
				fclose(out);
				return 0;
			}
		}
	//	fprintf(stdout,"%d %d %d %d\n",p,u,ver2[m2],m2);
	}
//	fprintf(stdout,"%d\n",p);
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			c[i][j]=-2;
			
	if (exista(p-1)||ver2[p-1])
		fprintf(out,"%d\n",p);
	else
		fprintf(out,"-1\n");
	fclose(in);
	fclose(out);
	return 0;
}