Cod sursa(job #3185306)

Utilizator manutrutaEmanuel Truta manutruta Data 18 decembrie 2023 18:10:14
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>

using namespace std;

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

int n, m, i1, j1, i2, j2, mn = 0x3f, i_min, j_min, a[101][101], viz[101][101],
d[8][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};


int valr[101][101];
int valj[101][101];


struct q_entry {
    int i, j, index;
};
queue<q_entry> q;



int on_map(int i, int j) {
    return (1 <= i && i <= n && 1 <= j && j <= m);
}

void lee(int istart, int jstart, int val[101][101])
{
    memset(viz, 0, sizeof(viz));
    val[istart][jstart] = 1;
    viz[istart][jstart] = 1;

    q.push({istart, jstart, 2});
    while (!q.empty())
    {
        q_entry c = q.front();
        q.pop();
        for (int k = 0; k < 8; k++)
        {
            int xx = c.i + d[k][0], yy = c.j + d[k][1];
            if (!on_map(xx, yy)) continue;
            if (a[xx][yy] == 1) continue;
            if (viz[xx][yy]) continue;

            viz[xx][yy] = 1;
            val[xx][yy] = c.index;

            q.push({xx, yy, c.index + 1});
        }
    }
}


int main()
{
    fin >> n >> m;
    fin.get();
    for (int i = 1; i <= n; i++)
    {
        char c[102];
        fin.getline(c, 101);
        for (int j = 0; j < m; j++)
        {
            if (c[j] == 'X') a[i][j+1] = 1;
            else if (c[j] == 'R') {
                a[i][j+1] = 1;
                i1 = i; j1 = j+1;
            }
            else if (c[j] == 'J') {
                a[i][j+1] = 1;
                i2 = i; j2 = j+1;
            }
        }
    }
    lee(i1, j1, valr);
    lee(i2, j2, valj);

    /*for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << valr[i][j] << ' ';
        }
        cout << endl;
    }
    cout << endl;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cout << valj[i][j] << ' ';
        }
        cout << endl;
    }*/

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (valr[i][j] == valj[i][j] && valr[i][j] != 0)
            {
                if (mn > valr[i][j])
                {
                    mn =  valr[i][j];
                    i_min = i;
                    j_min = j;
                }
            }

        }
    }
    fout << mn << " " << i_min << " " << j_min;
    return 0;
}