Cod sursa(job #218385)

Utilizator ilincaSorescu Ilinca ilinca Data 1 noiembrie 2008 19:23:14
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>

#define maxn 1005
#define inf maxn*maxn
#define pr(x) fprintf(stderr,#x" = %d\n",x)

struct marmota 
{
	int l, c;
};

int r, c, p=1, maxim, u, m [maxn] [maxn], x [maxn] [maxn];
char w [maxn] [maxn];
marmota pi, po, q [maxn*maxn*5];

void scan ()
{
	int i, j;
	scanf ("%d%d\n", &r, &c);
	for (i=1; i<=r; ++i)
		for (j=1; j<=c; ++j)
		{
			scanf("%c ", &w [i] [j]);
			if (w [i] [j] == '.')
				m [i] [j]=inf;
			else
				if (w [i] [j] == '*')
					m [i] [j]=-1;
				else
					if (w [i] [j] == 'D')
					{	
						m [i] [j]=0;
						q [++u].l=i;
						q [u].c=j;
					}
					else
						if (w [i] [j] == 'I')
						{
							m [i] [j]=inf;
							pi.l=i;
							pi.c=j;
						}
						else
							if (w [i] [j] == 'O')
							{	
								m [i] [j]=inf;
								po.l=i;
								po.c=j;
							}
		}
}

void bordare ()
{
	int i, j, r1=r+1, c1=c+1;
	for (i=0; i<=r; ++i)
		m [i] [0]=m [i] [r1]=-1;
	for (j=0; j<=c; ++j)
		m [0] [j]=m [c1] [j]=-1;
}

void lee1 ()
{
	int i, la, ca, dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};
	while (p <= u)
	{
		for (i=1; i<=4; ++i)
		{
			la=q [p].l+dl [i];
			ca=q [p].c+dc [i];
			if (m [la] [ca] > m [q [p].l] [q [p].c]+1)
			{
				m [la] [ca]=m [q [p].l] [q [p].c]+1;
				q [++u].l=la;
				q [u].c=ca;
			}
		}
		++p;
	}
}

void lee2 ()
{
	int i, la, ca, n=0, dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};
	p=u=1;
	q [p].l=pi.l;
	q [p].c=pi.c;
	x [pi.l] [pi.c]=m [pi.l] [pi.c];
	while (p <= u+n)
	{
		for (i=1; i<=4; ++i)
		{
			la=q [p].l+dl [i];
			ca=q [p].c+dc [i];
			if (x [la] [ca]  < x [q [p].l] [q [p].c])
			{
				q [++u].l=la;
				q [u].c=ca;
				if (m [la] [ca] < x [q [p].l] [q [p].c])
					x [la] [ca]=m [la] [ca];
				else
					x [la] [ca]=x [p [q].l] [p [q].c];
				if (la == po.l && ca == po.c && x [la] [ca] > maxim)
					maxim=x [la] [ca];

			}
			if (u == inf)
			{
				u=1;
				n*=inf;
			}
		}
		++p;
	}
}

int main ()
{
	freopen ("barbar.in", "r", stdin);
	freopen ("barbar.out", "w", stdout);
	scan ();
	bordare ();//m [] []
	lee1 ();//distanta de la fiecare punct la cel mai apropiat dragon -->m [i] [j]
	lee2 ();
	if (maxim)
		printf ("%d\n", maxim);	
	else
		printf ("-1\n");
	return 0;
}