Cod sursa(job #328638)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 2 iulie 2009 20:29:27
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<stdio.h>
#include<string.h>
struct queue
{
	int x,y;
};
int n,m,p,u,x1,y1,x2,y2;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
char v[1002][1002];
int d[1002][1002];
int mat[1002][1002];
queue q[1000002];
int te[1002][1002];
queue qu[1000002];

void read()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d %d\n",&n,&m);
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			scanf("%c",&v[i][j]);
			if(v[i][j]=='I')
			{
				x1=i;
				y1=j;
				v[i][j]='.';
			}
			if(v[i][j]=='O')
			{
				x2=i;
				y2=j;
				v[i][j]='.';
			}
			if(v[i][j]=='D')
			{
				q[++u].x=i;
				q[u].y=j;
			}
			if(v[i][j]=='*')
				d[i][j]=-1;
		}
		scanf("\n");
	}
	for(i=0;i<=n+1;i++)
		v[i][0]=v[i][m+1]='*';
	for(j=0;j<=m+1;j++)
		v[0][j]=v[n+1][j]='*';
}

void rez()
{
	int i,cx,cy;
	p=1;
	while(p<=u)
	{
		for(i=0;i<=3;i++)
		{
			cx=q[p].x+dx[i];
			cy=q[p].y+dy[i];
			if(v[cx][cy]=='.' && d[cx][cy]==0)
			{
				d[cx][cy]=d[q[p].x][q[p].y]+1;
				q[++u].x=cx;
				q[u].y=cy;
			}
		}
		p++;
	}
}

int exista(int dist)
{
	memset(mat,0,sizeof(mat));
	if(d[x1][y1]<dist)
		return 0;
	int i,cx,cy;
	p=u=1;
	q[1].x=x1;
	q[1].y=y1;
	while(p<=u)
	{
		for(i=0;i<=3;i++)
		{
			cx=q[p].x+dx[i];
			cy=q[p].y+dy[i];
			if(d[cx][cy]>=dist && mat[cx][cy]==0)
			{
				mat[cx][cy]=1;
				q[++u].x=cx;
				q[u].y=cy;
			}
		}
		p++;
	}
	return mat[x2][y2]==1;
}

void cautare()
{
	int st,dr,mij;
	st=1;
	dr=n*m;
	while(st!=dr)
	{
		mij=(st+dr)>>1;
		if(exista(mij)==0)
			dr=mij;
		else
			st=mij+1;
	}
	while(exista(st) && st<n*m)
		st++;
	while(exista(st)==0 && st>1)
		st--;
	if(exista(st))
	{
		printf("%d",st);
		return;
	}
	printf("0\n");
}

void test()
{
	int pp=1,uu=1,i,cx,cy;
	qu[pp].x=x1;
	qu[pp].y=y1;
	while(pp<=uu)
	{
		for(i=0;i<=3;i++)
		{
			cx=qu[pp].x+dx[i];
			cy=qu[pp].y+dy[i];
			if(v[cx][cy]=='.' && te[cx][cy]==0)
			{
				qu[++uu].x=cx;
				qu[uu].y=cy;
				te[cx][cy]=1;
			}
		}
		pp++;
	}
}

int main()
{
	read();
	test();
	if(te[x2][y2]==0)
	{
		printf("-1\n");
		return 0;
	}
	rez();
	cautare();
	return 0;
}