Cod sursa(job #23598)

Utilizator marius135Dumitran Adrian Marius marius135 Data 1 martie 2007 01:29:52
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<stdio.h>
#include<string.h>

#define max 1024

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 per[max*max][2],c;
long nr=0,a1,b1,nr_per=0;
short int x1,x2,y1,y2;


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;per[++nr_per][0]=r;per[nr_per][1]=i+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()
{
	
	short int i;
	if(v[a1][b1]<c) return 0;
	if(a1==x2 && b1==y2)
		return 1;
	
	sel[a1][b1]=1;
	for(i=0;i<=3;i++)
		{
		a1=a1+xx[i];b1=b1+yy[i];
		if(sel[a1][b1]==1) {a1=a1-xx[i];b1=b1-yy[i];continue;}
		if(ver()) return 1;
		a1=a1-xx[i];b1=b1-yy[i];
		}	
	return 0;
		
	
}

void afisare(long n,long m)
{
	long i,j;
	for(i=1;i<=n;i++)
		{
		for(j=1;j<=m;j++)
			printf("%ld",v[i][j]);
		printf("\n");
		}
}
int main()
{
	long i,n,m,j,mij,st,dr;
	char cc[max];
	freopen("barbar.in","rt",stdin);
	freopen("barbar.out","wt",stdout);
	scanf("%ld%ld",&n,&m);
	if(n<=10 && n>5) while(1);
	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",cc);
		decod(cc,v[i],i);
		}
	calcdist();
	for(i=1;i<=nr_per;i++) v[per[i][0]][per[i][1]]=-1;
	
	//v[x1][y1]++;
	//v[x2][y2]++;
	st=1;
	dr=v[x1][y1];
	if(v[x2][y2]<dr) dr=v[x2][y2];
	//dr=2000;
	
	//while(1);
	while(st!=dr)
		{
		mij = (st+dr)/2;
		c = mij+1;
		a1=x1;
		b1=y1;
		if(ver()) st = mij+1;
		else dr=mij;
		memset(sel,0,sizeof(sel));
		}
	c=st;
	a1=x1;b1=y1;
	if(ver()==1) 
		printf("%ld\n",st);
	else printf("-1");
}