Cod sursa(job #2313379)

Utilizator horiabogdanBogdan Horia-Matei horiabogdan Data 6 ianuarie 2019 19:17:48
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
ifstream f("rj2.in");
ofstream g("rj2.out");
int mat[105][105],n,m,tmin;
struct poz{int lin,col;}pozcrt,a,b;
const int dl[8]={-1,-1,0,1,1,1,0,-1};
const int dc[8]={0,1,1,1,0,-1,-1,-1};
poz coada[105*105];
int inc,sf=-1;
void citire()
{int i,j,lg;
char s[105];
f>>n>>m;
f.get();
for(i=1;i<=n;i++)
   {f.getline(s,105);
    lg=strlen(s);
    for(j=0;j<lg;j++)
        {
         if(s[j]==' ')
            mat[i][j+1]=0;
         else if(s[j]=='X')
            mat[i][j+1]=-1;
         else if(s[j]=='J')
               {mat[i][j+1]=1;
               a.lin=i;
               a.col=j+1;}
         else {mat[i][j+1]=0;
               b.lin=i;
               b.col=j+1;}
        }
   }
}
void bordare()
{int i,j;
for(i=0;i<=n+1;i++)
   {mat[i][0]=-1;
    mat[i][m+1]=-1;
   }
for(j=0;j<=m+1;j++)
   {mat[0][j]=-1;
    mat[n+1][j]=-1;
   }

}
void afisare()
{int i,j;
for(i=0;i<=n+1;i++)
    {for(j=0;j<=m+1;j++)
        g<<setw(2)<<mat[i][j]<<" ";
     g<<endl;}
g<<endl;
}
void lee()
{int i;
poz vecin;
coada[++sf]=a;
pozcrt=a;
while(inc<=sf && (pozcrt.lin!=b.lin || pozcrt.col!=b.col))
     {pozcrt=coada[inc++];
      for(i=0;i<8;i++)
          {vecin.lin=pozcrt.lin+dl[i];
           vecin.col=pozcrt.col+dc[i];
           if(mat[vecin.lin][vecin.col]==0)
             {mat[vecin.lin][vecin.col]=mat[pozcrt.lin][pozcrt.col]+1;
              coada[++sf]=vecin;}
          }

     }

g<<mat[b.lin][b.col]/2+1<<" ";
tmin=mat[b.lin][b.col]/2+1;
}
void drum()
{int i;
poz vecin;
pozcrt=b;
while(mat[pozcrt.lin][pozcrt.col]>tmin)
      {
       for(i=0;i<8;i++)
          {vecin.lin=pozcrt.lin+dl[i];
           vecin.col=pozcrt.col+dc[i];
           if(mat[vecin.lin][vecin.col]==mat[pozcrt.lin][pozcrt.col]-1)
              {pozcrt=vecin;
               break;
              }
          }

      }
 g<<pozcrt.lin<<" "<<pozcrt.col;
}
int main()
{
citire();
bordare();
lee();
drum();
    return 0;
}