Cod sursa(job #186206)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 26 aprilie 2008 21:14:48
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <stdio.h>
#define SI 1000000 
#define Nmax 1011
int b[Nmax][Nmax],a[Nmax][Nmax];
struct punct{int c1,c2;};
punct plec,sos;
short int va1[Nmax*Nmax*7];
short int vb1[Nmax*Nmax*7];
short int va2[Nmax*Nmax*7];
short int vb2[Nmax*Nmax*7];
int nrv1,nrv2;
const int lin[]={0,1,0,-1};
const int col[]={1,0,-1,0};

int rez,R,C;
inline int minim(int xx,int yy)
{
	if(xx<yy)
		return xx;
	return yy;
}	
void read()
{
	char ch;
	freopen("barbar.in", "r",stdin);
	freopen("barbar.out", "w",stdout);
	scanf("%d%d", &R,&C);
	for(int i=1;i<=R;++i)
	{
		scanf("%c", &ch);
		for(int j=1;j<=C;++j)
		{
			scanf("%c", &ch);
			if(ch=='I')
			{
				a[i][j]=SI;
				plec.c1=i;
				plec.c2=j;
			}	
			if(ch=='O')
			{
				a[i][j]=SI;
				sos.c1=i;
				sos.c2=j;
			}	
			if(ch=='.')
				a[i][j]=SI;
			if(ch=='*')
				a[i][j]=-2;
			if(ch=='D')
			{
				a[i][j]=0;
				va1[++nrv1]=i;
				vb1[nrv1]=j;
			}
		}	
	}	
}
/*void lee2(int x,int y)
{
	for(int t=0;t<4;t++)
		if(b[x+lin[t]][y+col[t]]<b[x][y])
		{
			b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
			va[++nrv]=x+lin[t];
			vb[nrv]=y+col[t];
		}
}*/
void make_lee()
{
	int x,y;
	for(int nr=1;;++nr)
	{
		if(nr%2)
		{
			nrv2=0;
			for(int i=1;i<=nrv1;i++)
			{
				x=va1[i];
				y=vb1[i];
				for(int t=0;t<4;t++)
					if(a[x+lin[t]][y+col[t]]>a[x][y]+1)
					{
						a[x+lin[t]][y+col[t]]=a[x][y]+1;
						va2[++nrv2]=x+lin[t];
						vb2[nrv2]=y+col[t];
					}
			}
		}	
		else
		{
			nrv1=0;
			for(int i=1;i<=nrv2;i++)
			{
				for(int t=0;t<4;t++)
					if((a[va2[i]+lin[t]][vb2[i]+col[t]]>a[va2[i]][vb2[i]]+1))
					{
						a[va2[i]+lin[t]][vb2[i]+col[t]]=a[va2[i]][vb2[i]]+1;
						va1[++nrv1]=va2[i]+lin[t];
						vb1[nrv1]=vb2[i]+col[t];
					}
			}
			nrv2=0;
		}
		if(!nrv1 && !nrv2)
			break;
	}	
	//printf("%d\n",nrv);
	for(int i=1;i<=R;++i)
		for(int j=1;j<=C;++j)
			b[i][j]=-1;
	b[plec.c1][plec.c2]=a[plec.c1][plec.c2];
	va1[1]=plec.c1;
	vb1[1]=plec.c2;
	nrv1=1;
	for(int nr=1;;++nr)
	{
		if(nr%2)
		{
			nrv2=0;
			for(int i=1;i<=nrv1;i++)
			{
				x=va1[i];
				y=vb1[i];
				for(int t=0;t<4;t++)
					if(b[x+lin[t]][y+col[t]]<b[x][y])
					{
						b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
						va2[++nrv2]=va1[i]+lin[t];
						vb2[nrv2]=vb1[i]+col[t];
					}
			}
		}	
		else
		{
			nrv1=0;
			for(int i=1;i<=nrv2;i++)
			{
				x=va2[i];
				y=vb2[i];
				for(int t=0;t<4;t++)
					if(b[x+lin[t]][y+col[t]]<b[x][y])
					{
						b[x+lin[t]][y+col[t]]=minim(a[x+lin[t]][y+col[t]],b[x][y]);
						va1[++nrv1]=va2[i]+lin[t];
						vb1[nrv1]=vb2[i]+col[t];
					}
			}
		}
		if(!nrv1 && !nrv2)
			break;
	}	
	rez=b[sos.c1][sos.c2];
}	
void print()
{
	//printf("%d %d %d %d\n",plec.c1,plec.c2,sos.c1,sos.c2);
	/*for(int i=1;i<=R;++i)
	{
		for(int j=1;j<=C;++j)
				printf("%d ",a[i][j]);
		printf("\n");
	}*/	
	//printf("\n");
	/*for(int i=1;i<=R;++i)
	{
		for(int j=1;j<=C;++j)
				printf("%d ",b[i][j]);
		printf("\n");
	}*/
	printf("%d\n",rez);

}
int main()
{
	read();
	make_lee();
	print();
	return 0;
}