Cod sursa(job #133417)

Utilizator georgelRector George georgel Data 8 februarie 2008 16:32:10
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.88 kb
#include<fstream>
#include<string.h>
#define Max 100
using namespace std;

ifstream fin("rj.in");
ofstream fout("rj.out");
char c[Max][Max];
int ir,jr,m,n,b[Max][Max],jj,ij;
const int di[] = {-1,-1,0,1,1,1,0,-1},
      dj[] = {0,1,1,1,0,-1,-1,-1};
void read()
{
     int i;
     fin>>m>>n;
     for(i = 0; i <= n; i++)
     {
           fin.getline(c[i],Max);
           strcpy(c[i]+1,c[i]);
     }
}
int search()
{
    int i,j,cont =1;
 for(i = 1; i <= n && cont == 1;i++)
     {
           for(j = 1; j <= m; j++)
                 if(c[i][j] == 'J')
                 {
                            ij = i;
                            jj = j;
                            cont = 0;
                 }
     }
     for(i = 1; i <= n ;i++)
     {
           for(j = 1; j <= m; j++)
           if(c[i][j] == 'R')
           {
           ir = i;
           jr = j;
           return 0;
           }
     }
return 0;
}
int ok(int i,int j)
{
    if(i < 1 or i > n || j < 1 or j > m)return 0;
    if(c[i][j] == 'X')return 0;
    if(b[i][j] != 0) return 0;
return 1;
}
void vec(int iv,int jv,int d)
{
    int i,l = Max,k = Max;
    for(i = 0; i < 8 ; i++)
    {
          if(b[iv+di[i]][jv+dj[i]] == d+1)
          {
                  if(l > iv + di[i])
                  {
                  l = iv+di[i];
                  k = jv+dj[i];
                  }
                  if( l == iv + di[i])
                    if( k > jv + dj[i])
                    k = jv + dj[i];
          }         
    }
    fout<<l<<" "<<k<<" ";
}          
void road()
{
     int i,j,k=1,d;
     b[ir][jr] = 1;
     while(b[ij][jj] == 0)
     {
                   for(i = 1; i <= n; i++)
                   {
                         for(j = 1; j <= m; j++)
                               if(b[i][j] == k)
                                for(d = 0; d < 8; d++)
                                      if(ok(i+di[d],j+dj[d]) == 1)
                                      b[i+di[d]][j+dj[d]] = k+1;
                   }
                   k = k+1;
     }
     d = b[ij][jj]/2;
     j = 1;
       /*           for(i = 1; i <= n; i++)
                   {
                         for(j = 1; j <= m; j++)
                         fout<<b[i][j]<<" ";
                         fout<<"\n";
                   }*/
 while(j == 1)
     { 
         for(i = 0; i < 8; i++)    
             if(b[ij-di[i]][jj-dj[i]] == k-1)
             { 
               k = k-1;
               ij = ij-di[i];
               jj = jj-dj[i];
               if(d+1 == k)
               {
               j = 0;
               break;
               }
             }                       
     }
   //  fout<<b[ij][jj]<<"\n";
          // vec(ij,jj,d);
            fout<<ij<<" "<<jj<<" ";
           fout<<d+1;
     //fout<<"\n";
}
int main(void)
{
    read();
    search();
    road();
}