Cod sursa(job #218544)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 2 noiembrie 2008 14:25:10
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include<stdio.h>
struct coord {
    int x,y;
};
char c;
int a[1005][1005];
int DistMin[1005][1005];
int contor;
int i;
int j;
int k;
char x;
char viz[1005][1005];
coord SirDragon[4000010],start,finish;
const int dx[10] = {0,-1,0,1,0};
const int dy[10] = {0,0,1,0,-1};
int nl;
int nc;
int Gasim(int u)
{
    int cap = 1;
    int i,j;
    int coada = 1;
    for(i=1;i<=nl;i++)
     for(j=1;j<=nc;j++)
      viz[i][j] = 0;
    SirDragon[cap] = start;
    if (DistMin[SirDragon[cap].x][SirDragon[cap].y] < u) return 0;
    viz[SirDragon[cap].x][SirDragon[cap].y] = 1;
    while (cap<=coada)
     {
         for(i=1;i<=4;i++)
          if (!viz[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]])
          if (DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] >=u)
          {
           viz[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] = 1;
           SirDragon[++coada].x = SirDragon[cap].x + dx[i];
           SirDragon[coada].y = SirDragon[cap].y + dy[i] ;
           if (SirDragon[coada].x == finish.x && SirDragon[coada].y== finish.y) return 1;
          }
      cap++;
     }
   return 0;
}
int Lee()
{
    int cap = 1;
    int i;
    int coada = contor;
    while (cap<=coada)
     {
         int cnstant = DistMin[SirDragon[cap].x][SirDragon[cap].y];
         for(i=1;i<=4;i++)
          if (a[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] == 1)
          if (DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]]  > cnstant+1)
          {
           DistMin[SirDragon[cap].x + dx[i]][SirDragon[cap].y + dy[i]] = cnstant+1;
           SirDragon[++coada].x = SirDragon[cap].x + dx[i];
           SirDragon[coada].y = SirDragon[cap].y + dy[i] ;
          }
      cap++;
     }
    return 0;
}

int BinSearch(int ls,int ld)
{
    int mij;
    while (ld-ls>1)
     {
        mij = (ls+ld)>>1;
        if (Gasim(mij)) ls = mij;
                   else ld = mij;
     }
  if (Gasim(ld)) return ld;
  else return ls;

}
int main()
{
   freopen("barbar.in","r",stdin);
   freopen("barbar.out","w",stdout);

   scanf("%d %d",&nl,&nc);
   for(i=1;i<=nl;i++)
    for(j=1;j<=nc;j++)
    {
     scanf("%c",&x);
     DistMin[i][j]=1000005;
     if (x == 10) j--;
     if (x == '.') a[i][j] = 1;
     if (x == '*') {DistMin[i][j] = -1 ; a[i][j] = -1;}
     if (x == 'D')
      {
          DistMin[i][j] = 0;
          a[i][j] = 1;
          SirDragon[++contor].x = i;
          SirDragon[contor].y = j;
      }
     if (x == 'I')
      {
          a[i][j] = 1;
          start.x = i;
          start.y = j;
      }
     if (x == 'O')
      {
          a[i][j] = 1;
          finish.x = i;
          finish.y = j;
      }
    }
    Lee();
    for(i=0;i<=nc+1;i++)
    {
     DistMin[0][i] = -5;
     DistMin[nl+1][i] = -5;
    }
    for(i=0;i<=nl+1;i++)
    {
     DistMin[i][0] = -5;
     DistMin[i][nc+1] = -5;
    }
    int answ = BinSearch(-1,nl*nc+1);
    printf("%d",answ);

   return 0;
}