Cod sursa(job #139398)

Utilizator O_NealS. Alex O_Neal Data 20 februarie 2008 02:03:11
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <fstream>
#define MAX 102
#define INFINIT 1000
using namespace std;


char a[MAX][MAX];
int R[MAX][MAX];
int J[MAX][MAX];
int c[MAX*MAX][2];
int n, m;
int si[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int sj[] = {-1, 0, 1, -1, 1, -1, 0, 1};

int ir, jr, ij, jj;
void Read();
void Lee(int, int, int[MAX][MAX]);
int Ok(int, int);
void Verifica();



int main()
{
   Read();
   Lee(ir, jr, R);
   Lee(ij, jj, J);
   Verifica();
  
   return 0;
}



void Read()
{
   ifstream fin("rj.in");
   fin >> n >> m;
   
   for (int i = 1; i <= n; i++)
   {
      fin.get();
      for (int j = 1; j <= m; j++)
      {
            a[i][j] = fin.get();
            R[i][j] =  J[i][j] = INFINIT;                  
            if (a[i][j] == 'R')
            {
               ir = i;
               jr = j;
               R[i][j] = 1;
            }
            if (a[i][j] == 'J')
            {
               ij = i;
               jj = j;
               J[i][j] = 1;
            }

      }   
      
   }
   fin.close();
}

void Lee(int is, int js, int b[MAX][MAX])
{
 //  p = u = 0;
   int in, jn;
   int i, j, p, u;
    for ( c[p = u = 0][0] = is, c[p][1] = js; p <= u; p++ )
    {
       i = c[p][0];
       j = c[p][1];
       for (int d = 0; d < 8; d++)
       {
          in = i + si[d];
          jn = j + sj[d];
          
          if ( Ok(in, jn) && b[in][jn] > b[i][j] + 1)
          {
             u++;
             b[in][jn] = b[i][j] + 1;
             c[u][0] = in;
             c[u][1] = jn;
          }   
       }  
       
    }
}


int Ok(int x, int y)
{
   if (a[x][y] == 'X') return 0;
   if (x < 1 || x > n || y < 1 || y > m)
      return 0;
   return 1;
}

void Verifica()
{
   ofstream fout("rj.out");
   int min = INFINIT;
   int mi, mj;
   for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++)
      {
         if (R[i][j] == J[i][j] && min > R[i][j])
         {
            min = R[i][j];
            mi = i;
            mj = j;
         }
      }
   fout << min << " " << mi << " " << mj;
   
   fout.close();
}