Cod sursa(job #180618)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 aprilie 2008 11:54:54
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<stdio.h>
int m,n,i,j,a[12][12],xi,yi,xo,yo,d,cx[101],cy[101],b,t,st,dr,mi,ok;
char h[13][13];
int lee(int dc);
int main()
{
	freopen("barbar.in","rt",stdin);
	freopen("barbar.out","wt",stdout);
	scanf("%d%d",&m,&n);
	for(i=0;i<=m+1;i++)h[i][0]='*';
	for(j=1;j<=n;j++)h[0][j]=h[m+1][j]='*';
	for(i=1;i<=m;i++)scanf("%s",&h[i][1]);
	for(i=0;i<=m+1;i++)h[i][n+1]='*';
	for(i=1;i<=m;i++)
	 for(j=1;j<=n;j++)
	  { if(h[i][j]=='.')continue;
	    if(h[i][j]=='*')continue;
	    if(h[i][j]=='D'){t++;cx[t]=i;cy[t]=j;a[i][j]=1;continue;}
	    if(h[i][j]=='I'){xi=i;yi=j;h[i][j]='.';continue;}
	    xo=i;yo=j;h[i][j]='.';
	  }
	for(b=1;b<=t;b++)
	{ i=cx[b];j=cy[b];d=a[i][j];
	  if(h[i+1][j]=='.'&&!a[i+1][j]){t++;cx[t]=i+1;cy[t]=j;a[i+1][j]=d+1;}
	  if(h[i-1][j]=='.'&&!a[i-1][j]){t++;cx[t]=i-1;cy[t]=j;a[i-1][j]=d+1;}
	  if(h[i][j+1]=='.'&&!a[i][j+1]){t++;cx[t]=i;cy[t]=j+1;a[i][j+1]=d+1;}
	  if(h[i][j-1]=='.'&&!a[i][j-1]){t++;cx[t]=i;cy[t]=j-1;a[i][j-1]=d+1;}

	}
	st=0;dr=(a[xi][yi]<a[xo][yo])?a[xi][yi]:a[xo][yo];
	ok=lee(dr);
	if(!ok){printf("-1\n");fcloseall();return 0;}
	while(dr-st>1)
	{ mi=(st+dr)>>1;
          ok=lee(mi);
	  if(lee(mi))dr=mi;
	  else st=mi;
	}
	printf("%d",dr);
	fcloseall();
	return 0;
}
int lee(int dc)
{       int viz[12][12]={0};
	b=t=1;cx[t]=xi;cy[t]=yi;
	while(b<=t&&!viz[xo][yo])
	{ i=cx[b];j=cy[b];
	  if(!viz[i+1][j])
	  { if(a[i+1][j]<dc||h[i+1][j]!='.')viz[i+1][j]=1;
	    else {t++;cx[t]=i+1;cy[t]=j;viz[i+1][j]=1;}
	  }
	  if(!viz[i-1][j])
	  {  if(a[i-1][j]<dc||h[i-1][j]!='.')viz[i-1][j]=1;
	     else {t++;cx[t]=i-1;cy[t]=j;viz[i-1][j]=1;}
	  }
	  if(!viz[i][j+1])
	  {  if(a[i][j+1]<dc||h[i][j+1]!='.')viz[i][j+1]=1;
	     else {t++;cx[t]=i;cy[t]=j+1;viz[i][j+1]=1;}
	  }
	  if(!viz[i][j-1])
	  {  if(a[i][j-1]<dc||h[i][j-1]!='.')viz[i][j-1]=1;
	     else {t++;cx[t]=i;cy[t]=j-1;viz[i][j-1]=1;}
	  }
	  b++;
	}
	if(viz[xo][yo])return 1;
	return 0;
}