Cod sursa(job #499176)

Utilizator AnDrEwBoYA Andrei AnDrEwBoY Data 8 noiembrie 2010 22:24:32
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<stdio.h>   
#include<string.h>   
int m,n,i,j,a[1024][1024],viz[1024][1024],viz0[1024][1024],xi,yi,xo,yo,d,   
cx[1000010],cy[1000010],b,t,st,dr,mi,ok,ii,jj;   
char h[1024][1024];   
void fill();   
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]='*';viz0[i][0]=1;}   
    for(j=1;j<=n;j++)   
    { h[0][j]=h[m+1][j]='*';viz0[0][j]=viz0[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]='*';viz0[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;viz0[i][j]=1;continue;}   
       if(h[i][j]=='D')   
       {t++;cx[t]=i;cy[t]=j;a[i][j]=2;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=2;   
    for(i=0;i<=m+1;i++)   
       for(j=0;j<=n+1;j++)   
        viz[i][j]=viz0[i][j];   
    fill();   
    if(!viz[xo][yo]){printf("-1\n");fcloseall();return 0;}   
    st=2;dr=1000005;   
    while(dr-st>1)   
    { mi=(st+dr)>>1;   
      for(i=0;i<=m+1;i++)   
       for(j=0;j<=n+1;j++)   
        viz[i][j]=viz0[i][j];   
  
      fill();   
      if(viz[xo][yo])   
       st=mi;   
      else  
       dr=mi;   
    }   
    printf("%d",st-2);   
    fcloseall();   
    return 0;   
}   
void fill()   
{ if(a[xi][yi]<mi)return;  
  t=1; b=1; cx[t]=xi; cy[t]=yi; viz[xi][yi]=1;
  for(b=1;b<=t;b++)
  { 
	 i=cx[b]; j=cy[b];
	 if(!viz[i-1][j]&&a[i-1][j]>=mi){ viz[i-1][j]=1; t++; cx[t]=i-1; cy[t]=j;}
	 if(!viz[i+1][j]&&a[i+1][j]>=mi){ viz[i+1][j]=1; t++; cx[t]=i+1; cy[t]=j;}
	 if(!viz[i][j-1]&&a[i][j-1]>=mi){ viz[i][j-1]=1; t++; cx[t]=i; cy[t]=j-1;}
	 if(!viz[i][j+1]&&a[i][j+1]>=mi){ viz[i][j+1]=1; t++; cx[t]=i; cy[t]=j+1;}
	}
}