Cod sursa(job #442630)

Utilizator HoriaClementHoriaC HoriaClement Data 14 aprilie 2010 21:31:50
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<cstdio>
#include<cstring>
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];

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;
			}
			if(v[i][j]=='O')
			{
				x2=i;
				y2=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++;
	}
	d[x2][y2]=n*m;
}

int exista(int dist)
{
	memset(mat,0,sizeof(mat));
	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;
	}
	printf("%d",st-1);
}

int main()
{
	read();
	rez();
	cautare();
	return 0;
}