Cod sursa(job #22517)

Utilizator love_for_uSpancioc Riana love_for_u Data 26 februarie 2007 19:32:33
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
//sursa buna de 90
#include <stdio.h>
#include <string.h>
#define NMAX 1111
int mat[NMAX][NMAX],viz[NMAX][NMAX];
int dl[4]={-1,0,1,0},dc[4]={0,1,0,-1};
struct punct { int x,y; };
punct c[NMAX*NMAX],p1,p2,p;
char ch,s[NMAX];
int n,m,i,j,k,s1,s2,bl,br,bm,ajuns;

void dfs(int val,int l1,int l2 )
{
 int i;
 if (l1==p2.x && l2==p2.y) ajuns=1;
 viz[l1][l2]=1;
  for (i=0;i<4;i++)
   if (mat[l1+dl[i]][l2+dc[i]]>=val && viz[l1+dl[i]][l2+dc[i]]==0)
     dfs(val,l1+dl[i],l2+dc[i]);
}

int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
s1=-1;
for (i=0;i<=n+1;i++)
 for (j=0;j<=m+1;j++)
   mat[i][j]=-2;
for (i=1;i<=n;i++)
{
   scanf("%s",s);
   for (j=1;j<=m;j++)
   {
   mat[i][j]=-1;
   if (s[j-1]=='*') mat[i][j]=-2;
   if (s[j-1]=='D') { mat[i][j]=0; c[++s1].x=i; c[s1].y=j; }
   if (s[j-1]=='I') { p1.x=i; p1.y=j; }
   if (s[j-1]=='O') { p2.x=i; p2.y=j; }
   }
}
s2=s1;
s1=0;
while (s1<=s2)
 {
  p=c[s1++];
  for (i=0;i<4;i++)
   if (mat[p.x+dl[i]][p.y+dc[i]]==-1)
    {
     mat[p.x+dl[i]][p.y+dc[i]]=mat[p.x][p.y]+1;
     c[++s2].x=p.x+dl[i];
     c[s2].y=p.y+dc[i];
    }
  }
bl=-1;
br=n*m*10;
while (br-bl>1)
 {
  bm=(bl+br)>>1;
  ajuns=0;
  memset(viz,0,sizeof(viz));
  dfs(bm,p1.x,p1.y);
  if (ajuns==1) bl=bm;
   else br=bm;
 }
if (bl>-1)printf("%d\n",bl);
 else printf("-1\n");
fclose(stdin);
fclose(stdout);
return 0;
}