Cod sursa(job #181289)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 18 aprilie 2008 10:30:52
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#include<string.h>
int m,n,i,j,a[1002][1002],viz[1002][1002],xi,yi,xo,yo,d,
cx[1000001],cy[1000001],b,t,st,dr,mi,ok,ii,jj;
char h[1003][1003];
void fill(int pi,int pj);
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]='*';viz[i][0]=1;}
	for(j=1;j<=n;j++)
	{ h[0][j]=h[m+1][j]='*';viz[0][j]=viz[m+1][j]=1;}
	for(i=1;i<=m;i++)scanf("%s",&h[i][1]);
	for(i=0;i<=m+1;i++){h[i][n+1]='*';viz[i][n+1]=1; }
	for(i=0;i<=m+1;i++)
	 for(j=0;j<=n+1;j++)
	 { if(h[i][j]=='.')continue;
	   if(h[i][j]=='*'){a[i][j]=1;viz[i][j]=1;continue;}
	   if(h[i][j]=='D')
	   {t++;cx[t]=i;cy[t]=j;a[i][j]=2;viz[i][j]=1;continue;}
	   if(h[i][j]=='I'){xi=i;yi=j;continue;}
	   xo=i;yo=j;
	 }
	for(b=1;b<=t;b++)
	{ i=cx[b];j=cy[b];d=a[i][j];
	  if(!a[i+1][j]){t++;cx[t]=i+1;cy[t]=j;  a[i+1][j]=d+1;}
	  if(!a[i-1][j]){t++;cx[t]=i-1;cy[t]=j;  a[i-1][j]=d+1;}
	  if(!a[i][j+1]){t++;cx[t]=i;  cy[t]=j+1;a[i][j+1]=d+1;}
	  if(!a[i][j-1]){t++;cx[t]=i;  cy[t]=j-1;a[i][j-1]=d+1;}
	}
	mi=3;
	memset(viz,0,sizeof(viz));fill(xi,yi);
	if(!viz[xo][yo]){printf("-1\n");fcloseall();return 0;}
        st=3;dr=1001;
	while(dr-st>1)
	{ mi=(st+dr)>>1;
	  memset(viz,0,sizeof(viz));
	  fill(xi,yi);
	  if(viz[xo][yo])
	   st=mi;
	  else
	   dr=mi;
	}
	printf("%d",st-2);
	fcloseall();
	return 0;
}
void fill(int pi,int pj)
{
	if(a[pi][pj]<mi)return;
        if(viz[pi][pj])return;
	viz[pi][pj]=1;
	fill(pi-1,pj);
	fill(pi+1,pj);
	fill(pi,pj-1);
	fill(pj,pj+1);
}