Cod sursa(job #2314107)

Utilizator horiabogdanBogdan Horia-Matei horiabogdan Data 7 ianuarie 2019 21:34:02
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
#include <iomanip>
#include <cstring>
using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");
int mat1[105][105],n,m,tmin,mat2[105][105],mini=9999999;
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;
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]==' ')
            mat1[i][j+1]=0;
         else if(s[j]=='X')
            mat1[i][j+1]=-1;
         else if(s[j]=='J')
               {mat1[i][j+1]=1;
               a.lin=i;
               a.col=j+1;}
         else {mat1[i][j+1]=1;
               b.lin=i;
               b.col=j+1;}
        }
   }

}
void bordare()
{int i,j;
for(i=0;i<=n+1;i++)
   {mat1[i][0]=-1;
    mat1[i][m+1]=-1;
   }
for(j=0;j<=m+1;j++)
   {mat1[0][j]=-1;
    mat1[n+1][j]=-1;
   }
for(i=0;i<=n+1;i++)
    for(j=0;j<=m+1;j++)
        mat2[i][j]=mat1[i][j];


}

void afisare(int mat[105][105])
{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(poz x, poz y,int mat[105][105])
{int i;
poz vecin;
inc=0;
sf=-1;
coada[++sf]=x;
pozcrt=x;
mat[y.lin][y.col]=0;
while(inc<=sf && ((pozcrt.lin!=y.lin || pozcrt.col!=y.col)) )
     {pozcrt=coada[inc++];
      for(i=0;i<8;i++)
          {if(pozcrt.lin!=y.lin || pozcrt.col!=y.col)
           {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;}
          }
          }

     }

}

int main()
{int i,j,linie,coloana;
citire();
bordare();
lee(a,b,mat1);
lee(b,a,mat2);
for(i=n;i>0;i--)
    for(j=m;j>0;j--)
        if(mat1[i][j]==mat2[i][j] && mat1[i][j]>0 && mat1[i][j]<=mini)
           {mini=mat1[i][j];
            linie=i;
            coloana=j;
            }
g<<mini<<" "<<linie<<" "<<coloana;

    return 0;
}