Cod sursa(job #138598)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 18 februarie 2008 21:49:11
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.88 kb
#include <fstream>      
#include <string.h>      
#define MAX 1105      
using namespace std;      
     
ifstream fin ("barbar.in");      
ofstream fout ("barbar.out");      
     
const int x[4]={-1,0,0,1};      
const int y[4]={0,-1,1,0};      
     
int a[MAX][MAX],n,m,xi,xf,yf,yi,ii[3000001],jj[3000001],numar,ok=0,minim,b[MAX][MAX];      
     
void citire()      
{      
    char s[1010];      
    fin>>n>>m;      
       fin.getline(s,1030);      
    for (int i=1;i<=n;i++)      
    {      
    fin.getline(s,1010);      
    for (int j=0;j<=m;j++)      
        if (s[j]=='*')      
           a[i][j+1]=-1;      
        else     
           if (s[j]=='D')      
           {      
         ii[numar]=i;      
         jj[numar]=j+1;      
             a[i][j+1]=1;      
         numar++;      
           }      
           else     
         if (s[j]=='I')      
         {      
            xi=i;      
            yi=j+1;      
         }      
         else     
           if (s[j]=='O')      
           {      
              xf=i;      
              yf=j+1;      
           }      
    }      
}      
     
int min (int a,int b)      
{      
   if (a<b)      
      return a;      
   return b;      
}      
     
void lee ()      
{      
    int nr=numar;      
    for (int i=0;i<nr;i++)      
      for (int k=0;k<4;k++)      
     if (a[ii[i] +x[k]][jj[i] +y[k]]==0 ){      
       a[ii[i] +x[k]][jj[i] +y[k]] = a[ii[i]][jj[i]]+1;      
       ii[nr]=ii[i]+x[k];      
       jj[nr]=jj[i]+y[k];      
       nr++;      
   }      
}      
     
void fct()      
{      
   int max=n;      
   if (m>n)      
      max=m;      
     
   for (int r=0;r<=max;r++)      
   {      
      a[r][0]=-1;      
      a[r][m+1]=-1;      
      a[n+1][r]=-1;      
      a[0][r]=-1;      
   }      
   lee();      
}      
     
     
int da(int ups)      
{      
    memset(b,0,sizeof(b));      
    ii[0]=xi;      
    jj[0]=yi;      
    int nr=0;      
    if (a[xi][yi]>=ups){      
       b[xi][yi]=1;      
        nr=1;      
    }      
    for ( int i=0;i<nr;i++)      
          for ( int k=0;k<4;k++)      
              if (a[ii[i] +x[k]][jj[i] +y[k]]>=ups&& b[ii[i]+x[k]][jj[i]+y[k]]==0)      
              {      
                    b[ii[i] +x[k]][jj[i] +y[k]]=1;      
                    ii[nr]=ii[i]+x[k];      
                    jj[nr]=jj[i]+y[k];      
                    nr++;      
              }      
return b[xf][yf];      
}      
void caut()      
{      
           
     for (int q=1;q<=n;q++)      
            for (int w=1;w<=m;w++)      
                  if (a[q][w]>-1)
                     if (da(a[q][w]))
                           if (minim<a[q][w])      
                                 minim=a[q][w];  
          
}      
     
     
void okk()      
{      
     int nr=1;      
    ii[0]=xi;      
    memset(b,0,sizeof(b));   
    jj[0]=yi;      
    a[xi][yi]=-2;      
    b[xi][yi]=1;   
    for (int i=0;i<nr;i++)      
           for (int k=0;k<4;k++)      
               if (a[ii[i] +x[k]][jj[i] +y[k]]!=-1 && b[ii[i] +x[k]][jj[i] +y[k]]==0)      
               {      
                   b[ii[i]+x[k]][jj[i]+y[k]]=1;   
                   a[ii[i] +x[k]][jj[i] +y[k]]=-2;      
                   ii[nr]=ii[i]+x[k];      
                   jj[nr]=jj[i]+y[k];      
                   nr++;      
               }      
}      
     
int main ()      
{      
       minim=0;      
   citire();      
   fct();      
   caut();     
   okk();      
  if (a[xf][yf]!=-2)      
      fout<<"-1\n";      
  else     
          fout<<minim-1<<"\n";      
   for (int i=1;i<=n;i++){   
          for (int j=1;j<=m;j++)   
                fout<<a[i][j]<<" ";   
          fout<<"\n";   
   }   
   fout.close();      
   return 0;      
}