Cod sursa(job #184349)

Utilizator AndreyPAndrei Poenaru AndreyP Data 23 aprilie 2008 15:54:22
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
//#include<alloc.h>
int a[1015][1015],b[1015][1015],r,c,ok;
const char dx[]={0,1,0,-1};
const char dy[]={1,0,-1,0};
struct cod
{
	int y,x;
};
int inc,sf=-1;
cod k1,k2,now,next,co[1500001];
void citeste()
{
	int i,j;
	char aux;
	for(i=0; i<=r+1; i++)
		a[i][0]=a[i][c+1]=-2;
	for(i=0; i<=c+1; i++)
		a[0][i]=a[r+1][i]=-2;
	for(i=1; i<=r; i++)
	{
		for(j=1; j<=c; j++)
		{
			scanf("%c",&aux);
			switch(aux)
			{
				case 'D': {co[++sf].x=j; co[sf].y=i; a[i][j]=-1;} break;
				case '.': break;
				case '*': a[i][j]=-2; break;
				case 'I': {k1.x=j; k1.y=i;} break;
				case 'O': {k2.x=j; k2.y=i;} break;
			}
		}
		scanf("\n");
	}
}
void bf()
{
	int i;
	while(inc<=sf)
	{
		now=co[inc++];
		for(i=0; i<4; i++)
		{
			next.x=now.x+dx[i];
			next.y=now.y+dy[i];
			if(a[next.y][next.x]==0)
			{
				co[++sf]=next;
				if(a[now.y][now.x]!=-1)
					a[next.y][next.x]=a[now.y][now.x]+1;
				else
					a[next.y][next.x]=1;
			}
		}
	}
}
void dfs(int x,int y)
{
	int i,x1,y1;
	for(i=0; i<4; i++)
	{
		x1=x+dx[i];
		y1=y+dy[i];
		if(a[y1][x1]!=-2)
		{
			int min=a[y1][x1];
			if(b[y][x]<min)
				min=b[y][x];
			if(min>b[y1][x1])
			{
				b[y1][x1]=min;
				if((y1==k2.y)&&(x1==k2.x))
					ok=1;
				dfs(x1,y1);
			}
		}
	}
}				
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d\n",&r,&c);
	citeste();
	bf();
	b[k1.y][k1.x]=a[k1.y][k1.x];
	dfs(k1.x,k1.y);
	if(ok)
		printf("%d\n",b[k2.y][k2.x]);
	else
		printf("-1\n");
	return 0;
}