Cod sursa(job #229919)

Utilizator FlorianFlorian Marcu Florian Data 12 decembrie 2008 09:40:45
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<stdio.h>
#define Max 1024
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int n,m,ok;
int a[Max][Max], b[Max][Max];
int c[2][Max*Max];
int p,u;
int x1,x2,y1,y2;
void read()
 {
 int i,j;
 fscanf(f,"%d %d\n",&n,&m);
 char x;
 for(i=0;i<=m+1;++i) b[0][i]=b[n+1][i]=a[0][i]=a[n+1][i]=-1;
 for(i=0;i<=n+1;++i) b[i][0]=b[i][m+1]=a[i][0]=a[i][m+1]=-1;
 for(i=1;i<=n;++i)
  {
  for(j=1;j<=m;++j)
   {
   fscanf(f,"%c",&x);
   if(x=='I'){ x1=i,y1=j,a[i][j]=-2,b[i][j]=-2;           }
   else if(x=='O') {x2=i, y2=j , a[i][j]=-2, b[i][j]=-2;  }
   else if(x=='D')
    {
    c[0][p]=i;
    c[1][p++]=j;
    a[i][j]=0;
    b[i][j]=-2;
    }
   else if(a[i][j]=='*') {a[i][j]=-1, b[i][j]=-1;}
   else a[i][j]=b[i][j]=-2;
   }
  fscanf(f,"\n");
  }
 }
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
void bfs()
 {
 int nx,ny,x,y,i;
 u=p-1;
 p=0;
 while(p<=u)
  {
  x=c[0][p];
  y=c[1][p++];
  for(i=0;i<4;++i)
   {
    nx=x+dx[i]; ny=y+dy[i];
    if(a[nx][ny]==-2)
     {
     a[nx][ny]=a[x][y]+1;
     c[0][++u]=nx;
     c[1][u]=ny;
     }
    }
   }
 }
int bf(int l)//pot calatori a.i. dist pana la cel mai apropiat dragon este cel putin l
 {
 int p=0,u=0;
 int d[Max][Max];
 int i,j;
 for(i=0;i<=n+1;++i)
  for(j=0;j<=m+1;++j)
   d[i][j]=b[i][j];
 int x,y,nx,ny;
 c[0][0]=x1; c[1][0]=y1;
 d[x1][y1]=0;
 while(p<=u && d[x2][y2]==-2)
  {
  x=c[0][p];
  y=c[1][p++];
  for(i=0;i<4;++i)
   {
   nx=dx[i]+x; ny=y+dy[i];
   if(d[nx][ny]==-2 && a[nx][ny]>=l)
     {
     d[nx][ny]=d[x][y]+1;
     c[0][++u]=nx;
     c[1][u]=ny;
     }
   }
  }
 if(d[x2][y2] != -2) {/*fprintf(g,"\n%d\n",l); afis(d);*/ return 1; }
 else return 0;
 }
void binar()
 {
 int p,r,i,j,l;
 i=0; j=m*n;
 while(i<=j)
  {
  l=(i+j)/2;
  r=bf(l);
  if(r==0) j=l-1;
  else
   {
   p=bf(l+1);
   if(p==0)
    {
    ok=1;
    fprintf(g,"%d\n",l);
    return;
    }
   else i=l+1;
   }
 }
}
int main()
 {
 read();
 bfs();
 binar();
 if(!ok) fprintf(g,"-1\n");
 return 0;
 }