Cod sursa(job #274727)

Utilizator SheepBOYFelix Liviu SheepBOY Data 9 martie 2009 22:32:42
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include<stdio.h>
#define N 1001
struct POS{
	short int i,j;
};
POS drg[100001];
int nr,sl,sc,lo,co,m,n;
short int lache[N][N],brd[N][N];
void bord()
{
	int i,j;
	
	for(i=0;i<=n;++i)
		lache[i][0]=lache[i][m+1]=-4;
	for(i=0;i<=m;++i)
		lache[0][i]=lache[n+1][i]=-4;
}
void scan()
{
	char aux;
	int i,j;
	
	scanf("%d%d\n",&n,&m);
	for(i=1;i<=n;++i)
	{
		for(j=1;j<=m;++j)
		{
			scanf("%c",&aux);
			brd[i][j]=aux;
			if(aux=='*')
				lache[i][j]=-2;
			if(aux=='D')
			{
				lache[i][j]=-3;
				drg[nr].i=i;
				drg[nr++].j=j;
			}
			if(aux=='.')
				lache[i][j]=-1;
			if(aux=='I')
			{
				lache[i][j]=0;
			sl=i;
			sc=j;
			}
			if(aux=='O')
			{
				lache[i][j]=0;
			lo=i;
			co=j;
			}
		}
		scanf("\n");
	}
}	
int dl[4]={-1,1,0,0};
int dc[4]={0,0,-1,1};
int abs(int a,int b)
{
	if(a<0)
		a=-a;
	if(b<0)
		b=-b;
	return a+b;
}
int get_closest_drg(POS y)
{
	int trmd,i,max=1000000000;
	
	for(i=0;i<nr;++i)
	{
		trmd=abs(y.i-drg[i].i,y.j-drg[i].j);
	if(max>trmd)
		max=trmd;
	}
	return max;
}
int navigate(int d,POS x,int sw)
{
	if(d==0&&!sw)
		return x.i-1;
	if(d==1&&!sw)
		return x.i+1;
	if(d==2&&sw)
		return x.j-1;
	if(d==3&&sw)
		return x.j+1;
	if(!sw)
		return x.i;
	if(sw)
		return x.j;
}
void lee()
{
	POS q[500000],x,y;
	int i,p=0,u=0,dst;
	q[u].i=sl;
	q[u].j=sc;
	u++;
	while(p!=u)
	{
		x.i=q[p].i;
		x.j=q[p].j;
		p++;
		
		for(i=0;i<4;++i)
		{
			y.i=x.i+dl[i];
			y.j=x.j+dc[i];
			if(brd[y.i][y.j]!='I')
			{
				dst=get_closest_drg(y);
				
				if(!lache[x.i][x.j])
					lache[x.i][x.j]=dst;
				else
					if(dst>lache[x.i][x.j])
						dst=lache[x.i][x.j];
				if(lache[y.i][y.j]>-2)
				{
					if(lache[y.i][y.j]<dst)
					{
						lache[y.i][y.j]=dst;
						if(brd[y.i][y.j]!='*')
						{
							q[u].i=y.i;
							q[u++].j=y.j;
						}
					}
				}
			}
		}
	}
}

/*void lee()
{
	POS x,y,q[100000];
	int p,u,i;
	p=u=0;
	
		q[u].i=lo;
		q[u++].j=co;
	while(p!=u)
	{
		x.i=q[p].i;
		x.j=q[p++].j;
		for(i=0;i<4;++i)
		{
			y.i=navigate(i,x,0);
			y.j=navigate(i,x,1);
			if(lache[y.i][y.j]>0||lache[y.i][y.j]==-1)
				{
				lache[y.i][y.j]=1+lache[x.i][x.j];
				q[u].i=y.i;
				q[u++].j=y.j;
				}
		}
	}
}*/
int main()
{
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scan();
	bord();
	lee();
	if(lache[lo][co]<0)
		printf("-1");
	else
		printf("%d",lache[lo][co]);
	return 0;
}