Cod sursa(job #23543)

Utilizator marius135Dumitran Adrian Marius marius135 Data 1 martie 2007 00:38:30
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<stdio.h>
#include<string.h>

#define max 1023

long v[max][max];
long xx[4]={0,1,0,-1},yy[4]={1,0,-1,0};
short int sel[max][max];
long sol[max][max];
long t[max*max][2];
long x1,x2,y1,y2,nr=0;


void decod(char *a,long *vv,long r)
{
	long i,x = strlen(a);
	for( i = 0; i < x; i++)
		{
		if(a[i]=='.') vv[i+1]=0;
		if(a[i]=='*') vv[i+1]=-1;
		if(a[i]=='D') {vv[i+1]=0;t[++nr][0]=r;t[nr][1]=i+1;sol[r][i+1]=1;}//pot mere pe langa dragon???
		if(a[i]=='I') {x1=r;y1=i+1;}
		if(a[i]=='O') {x2=r;y2=i+1;}
		}
}
void calcdist()
{
	long ii,i,a,aa,bb,b;
	for(ii=1;ii<=nr;ii++)
		{
		a=t[ii][0];
		b=t[ii][1];
		for(i=0;i<=3;i++)
			{
			aa=a+xx[i];bb=b+yy[i];
			if(sol[aa][bb]==0) 
				{
				sol[aa][bb] = 1;
				v[aa][bb]=v[a][b]+1;
				t[++nr][0]=aa;
				t[nr][1]=bb;
				}
			}
		
		}
}

long ver(long a,long b,long c)
{
	long aa,bb,i;
	if(v[a][b]<c) return 0;
	if(a==x2 && b==y2)
		return 1;
	sel[a][b]=1;
	for(i=0;i<=3;i++)
		{
		aa=a+xx[i];bb=b+yy[i];
		if(sel[aa][bb]==1) continue;
		if(ver(aa,bb,c)) return 1;
		}	
	return 0;
		
	
}

int main()
{
	long i,n,m,j,mij,st,dr;
	char c[max];
	freopen("barbar.in","rt",stdin);
	freopen("barbar.out","wt",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=0;i<=n+1;i++)
		for(j=0;j<=m+1;j++)
			{v[i][j]=-2;sol[i][j]=1;}
	for(i=1;i<=n;i++) for(j=1;j<=m;j++) sol[i][j]=0;
	for(i=1;i<=n;i++)
		{
		scanf("%s",c);
		decod(c,v[i],i);
		}
	calcdist();
	st=1;
	dr=v[x1][y1];
	if(ver(x1,y1,1)==0) {printf("-1";return 0;}
	while(st!=dr)
		{
		mij = (st+dr)/2;
		if(ver(x1,y1,mij+1)) st = mij+1;
		else dr=mij;
		memset(sel,0,sizeof(sel));
		}
	printf("%ld\n",st);
}