Cod sursa(job #127368)

Utilizator za_wolfpalianos cristian za_wolf Data 23 ianuarie 2008 19:37:50
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#define NMAX 401
long lin[]={1,-1,0,0};
long col[]={0,0,-1,1};
long c,in,b,sf,x[NMAX][NMAX],y[NMAX][NMAX],z[NMAX][NMAX],i,j,k,l,n,m,a,xi,yi,xf,yf;
struct kkt
{
long X,Y,K;
};
kkt q[NMAX*NMAX];
int main()
{
    freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%ld%ld%c",&n,&m);
	m--;
	for (i=1;i<=n;i++)
	{
		for (j=0;j<=m;j++)
		{
			scanf("%c",&c);
			if (c=='D')
			{
				q[++sf].X=i;
				q[sf].Y=j+1;
				q[sf].K=0;
				y[i][j+1]=2;  //RASPUNSUL ESTE NU!!!!!!!!!
			} else
			if (c=='*')
			   y[i][j+1]=1;
			else
			{
				if (c=='I') {xi=i; yi=j+1;}
				if (c=='O') {xf=i;yf=j+1;}
			}

		}
		scanf("\n");
	}
	in=1;
	m++;

	while (in<=sf)
	{
		for (i=0;i<=3;i++)
		{
			a=q[in].X+lin[i];
			b=q[in].Y+col[i];
			if (a>=1&&a<=n&&b>=1&&b<=m&&z[a][b]==0&&y[a][b]!=1)
			{
				sf++;
				q[sf].X=a;
				q[sf].Y=b;
				q[sf].K=q[in].K+1;
				z[a][b]=q[sf].K;
			}
		}
		in++;
	}

	k=-1;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
		{
			if (z[i][j]>k)
				k=z[i][j];
			y[i][j]=0;
		}
	for (j=k;j>=1;j--)
	{
		in=1;
		sf=1;
		q[1].X=xi;
		q[1].Y=yi;
		y[xi][yi]=1;
		while (in<=sf)
		{
			for (i=0;i<=3;i++)
			{
				a=q[in].X+lin[i];
				b=q[in].Y+col[i];
				if (a>=1&&a<=n&&b>=1&&b<=m&&y[a][b]!=1&&z[a][b]>=j)
				{
					if (a==xf&&b==yf) {printf("%ld\n",j); return 0;}
					sf++;
					q[sf].X=a;
					q[sf].Y=b;
					y[a][b]=1;
				}


			}
			in++;
		}

		for (i=1;i<=n;i++)
			for (a=1;a<=m;a++)
			y[i][a]=0;
	}

	return 0;
}