Cod sursa(job #2433222)

Utilizator AnastasiaStefanescuAnastasia Stefanescu AnastasiaStefanescu Data 26 iunie 2019 13:36:13
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.65 kb

#include <fstream>
#include <iostream>
using namespace std;

ifstream fin ("rj.in");
ofstream fout ("rj.out");

int n, m, x[102][102], i, j, clin[10001], ccol[10001], k, p, auxr[102][102], minim, lj, cj, val, i2, j2, auxj[102][102];
int l[9] = {-1, -1, -1, 0, 1, 1, 1, 0}, c[9] = {-1, 0, 1, 1, 1, 0, -1, -1};
char a;

int jmin,imin;

int main()
{
    
    
    fin >> n >> m;
    // a = fin.get(); // citeste mai intai '\r'
    a = fin.get(); // citeste mai intai '\n'
    for (i = 1; i<= n; i++)
    {
        for (j = 1; j<= m; j++)
        {
            a = fin.get();
            
            //  fout<<a;
            
            switch (a) {
                case 'X':
                    auxr[i][j] = auxj[i][j] = x[i][j] = -1;
                    break;
                case 'R':
                    x[i][j] = auxj[i][j] = 0;
                    auxr[i][j] = 1;
                    k = 1;
                    clin[1] = i;
                    ccol[1] = j;
                    break;
                case 'J':
                    x[i][j] = auxr[i][j]= 0;
                    auxj[i][j] = 1;
                    lj = i;
                    cj = j;
                    break;
                case ' ': // spatiu
                    auxr[i][j] = auxj[i][j] = x[i][j] = 0;
                    break;
                default: // \n
                    for (p = j; p<=m; p++)
                        auxr[i][p] = auxj[i][p] = x[i][p] = 0;
                    j = m+2;
                    break;
            }
        }
        if (j<m+2)
            a = fin.get();
        
        // fout<<a;
        // a = fin.get();
    }
    
    /*  for (i = 1; i<= n; i++)
     {
     for (j = 1; j<= m; j++)
     cout << x[i][j] << " ";
     cout << "\n";
     }
     */
    //pt romeo
    while (k > 0)
    {
        val = auxr[clin[1]][ccol[1]];
        
        for (p = 0; p< 8; p++)
        {
            i2 = clin[1] + l[p];
            j2 = ccol[1] + c[p];
            if(i2<=n and i2>=1 and j2<=m and j2>=1 and x[i2][j2] == 0 && auxr[i2][j2] == 0)
            {
                k++;
                clin[k] = i2;
                ccol[k] = j2;
                auxr[i2][j2] = val+1;
            }
        }
        
        for (i = 1; i<= k-1; i++)
        {
            clin[i] = clin[i+1];
            ccol[i] = ccol[i+1];
        }
        k--;
    }
    
    
    
    /*   for (i = 1; i<= n; i++)
     {
     for (j = 1; j<= m; j++)
     cout << auxr[i][j] << " ";
     cout << "\n";
     }
     */
    
    //pt julieta
    k = 1;
    clin[1] = lj;
    ccol[1] = cj;
    
    while (k > 0)
    {
        val = auxj[clin[1]][ccol[1]];
        
        for (p = 0; p< 8; p++)
        {
            i2 = clin[1] + l[p];
            j2 = ccol[1] + c[p];
            if(i2<=n and i2>=1 and j2<=m and j2>=1 and x[i2][j2] == 0 && auxj[i2][j2] == 0)
            {
                k++;
                clin[k] = i2;
                ccol[k] = j2;
                auxj[i2][j2] = val+1;
            }
        }
        
        for (i = 1; i<= k-1; i++)
        {
            clin[i] = clin[i+1];
            ccol[i] = ccol[i+1];
        }
        k--;
    }
    
    
    
    /*    for (i = 1; i<= n; i++)
     {
     for (j = 1; j<= m; j++)
     cout << auxj[i][j] << " ";
     cout << "\n";
     }
     
     */
    //gasire punct de intalnire
    minim = 10002;
    jmin=1000;
    val = 0;
    for (i = 1; i<= n; i++)
        for (j = 1; j<= m; j++)
            if(auxr[i][j] == auxj[i][j] && auxr[i][j] > 0 && auxr[i][j] < minim)
            {
                val=1;
                minim = auxr[i][j];
                clin[val] = i;
                ccol[val] = j;
                
                jmin=j;
                imin=i;
            }
            else if(auxr[i][j] == auxj[i][j] && auxr[i][j] > 0 && auxr[i][j] == minim and i<imin)
            {
                val=1;
                minim = auxr[i][j];
                clin[val] = i;
                ccol[val] = j;
                jmin=j;
                imin=i;
            }
    
            else  if(auxr[i][j] == auxj[i][j] && auxr[i][j] > 0 && auxr[i][j] == minim and i==imin and j<jmin)
                
            {
                
                val=1;
                minim = auxr[i][j];
                clin[val] = i;
                ccol[val] = j;
                
                jmin=j;imin=i;
                
            }
    
    
    
    //   if(val == 1)
    fout << minim << " " << clin[1] << " " << ccol[1];
    /*   else
     if(val > 1)
     {
     k = 102;
     i2 = 0;
     for (i = 1; i<= val; i++)
     if(k > ccol[i])
     {
     k = ccol[i];
     i2 = i;
     }
     
     fout << minim << " " << clin[i2] << " " << ccol[i2];
     }
     
     */
    
    return 0;
}