Cod sursa(job #189398)

Utilizator savimSerban Andrei Stan savim Data 14 mai 2008 12:36:18
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include <stdio.h>
#include <string.h>
#define maxl 1010

int p,q,i,j,k1,k2,n,m,nd,x1,y1,x2,y2,k,l,r,sol;
bool a[maxl][maxl];
int c[maxl][maxl],mat[maxl][maxl];
int d[2][maxl*maxl];
int o[4]={0,0,-1,1};
int v[4]={-1,1,0,0};
char s[maxl];

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    
    scanf("%d %d",&n,&m);
    
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
            c[i][j]=maxl*maxl;
                
    nd=0;
    for (i=1; i<=n; i++)
    {
        scanf("%s",s+1);
        
        for (j=1; j<=m; j++)
        {
            if (s[j]=='D')
            {
               nd++;
               d[0][nd]=i;
               d[1][nd]=j;
               c[i][j]=1;
            }
            
            if (s[j]=='*') a[i][j]=1;
            
            if (s[j]=='I')
            {
               x1=i;
               y1=j;
            }
            else if (s[j]=='O')
                 {
                    x2=i;
                    y2=j;              
                 }
        }
    }

    p=0;q=nd;
    while (p<q)
    {
          p++;
          for (i=0; i<=3; i++)
          {
              k1=d[0][p]+o[i];
              k2=d[1][p]+v[i];
              
              if (k1>0 && k1<=n && k2>0 && k2<=m && c[k1][k2]>c[d[0][p]][d[1][p]]+1 && !a[k1][k2])
              {
                 c[k1][k2]=c[d[0][p]][d[1][p]]+1;
                 q++;
                 d[0][q]=k1;
                 d[1][q]=k2;
              }
          }
    }
    
    p=-1;q=n*m+1;
    sol=-1;
    while (p+1<q)
    {
          k=(p+q)/2;

          for (i=1; i<=n; i++)
             for (j=1; j<=m; j++)
                mat[i][j]=0;
                
          l=0;r=1;
          d[0][r]=x1;
          d[1][r]=y1;
          mat[x1][y1]=1;

          if (c[x1][y1]>k)
          while (l<r)
          {
                l++;
                for (i=0; i<=3; i++)
                {
                    k1=d[0][l]+o[i];
                    k2=d[1][l]+v[i];
              
                    if (k1>0 && k1<=n && k2>0 && k2<=m && c[k1][k2]>k && !a[k1][k2] && mat[k1][k2]==0)
                    {
                       r++;
                       mat[k1][k2]=1;
                       d[0][r]=k1;
                       d[1][r]=k2;
                    }
              }                      
          }
          
          if (mat[x2][y2]==1)
          {
             sol=k;
             p=k;
          }
          else q=k;
    }
    
    printf("%d\n",sol);
    
    return 0;
}