Cod sursa(job #184163)

Utilizator znakeuJurba Andrei znakeu Data 23 aprilie 2008 11:28:24
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#define MAXN 1005

struct coord
{
	int x,y;
};

int dx[5]={1,-1,0,0};
int dy[5]={0,0,-1,1};

int v[MAXN][MAXN];
int v2[MAXN][MAXN];
coord dragons[MAXN*MAXN];
int Sx,Sy,Ex,Ey,n,m,D=0;

void citire()
{
	char s[MAXN*2]; int i,j;
	
	fgets(s,32,stdin);
	
	n=0; m=0; j=0;
	
	while (s[j]>='0' && s[j]<='9')
		n=n*10+s[j++]-'0';
	
	j++;
	
	while (s[j]>='0' && s[j]<='9')
		m=m*10+s[j++]-'0';
	
	for (i=1; i<=n; ++i)
	{
		fgets(s,MAXN*2,stdin);
		for (j=1; j<=n; ++j)
		{
			if (s[j-1]=='.')
				v[i][j]=-1;
			if (s[j-1]=='D')
			{
				v[i][j]=0;
				dragons[D].x=i;
				dragons[D].y=j;
				D++;
			}
			if (s[j-1]=='*')
				v[i][j]=-4;
			if (s[j-1]=='I')
			{
				v[i][j]=-1;
				Sx=i; Sy=j;				
			}
			if (s[j-1]=='O')
			{
				v[i][j]=-1;
				Ex=i; Ey=j;
			}
		}		
	}
	
	for (i=0; i<=m+1; ++i)
	{
		v[0][i]=-4;
		v[n+1][i]=-4;		
	}
	
	for (i=0; i<=n+1; ++i)
	{
		v[i][0]=-4;
		v[i][m+1]=-4;		
	}	
}

void wtf()
{
	int i,j;
	for (i=0; i<D; ++i)
		for (j=0; j<4; ++j)
			if (v[ dragons[i].x + dx[j] ] [ dragons[i].y + dy[j] ] == -1)
			{
				v[ dragons[i].x + dx[j] ] [ dragons[i].y + dy[j] ] = v[ dragons[i].x ] [ dragons[i].y ] +1;
				dragons[D].x=dragons[i].x+ dx[j];
				dragons[D].y=dragons[i].y+ dy[j];
				D++;
			}	
}

inline int min(int a, int b)
{
	if (a>b)
		return b;
	return a;	
}


void wtf2(int x, int y, int z)
{
	int k;
	v2[x][y]=z;
	for (int i=0; i<4; ++i)
		if (v[ x + dx[i] ][ y + dy[i] ] > 0)
		{
			k=min(z,v[ x + dx[i] ][ y + dy[i] ]);
			if (v2[ x + dx[i] ][ y + dy[i] ] <=0 || v2[ x + dx[i] ][ y + dy[i] ] < k)
			wtf2(x+dx[i],y+dy[i],k);		
		}
}

int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	
	citire();	
	wtf(); v2[Ex][Ey]=-1;
	wtf2(Sx,Sy,v[Sx][Sy]);
	printf("%d\n",v2[Ex][Ey]);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}