Cod sursa(job #2571948)

Utilizator gabiadiBoscanici Adrian Gabriel gabiadi Data 5 martie 2020 10:56:39
Problema Rj Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");

const int DMAX = 100;

struct pozitie
{
    int x, y;
};
int M, N, L[DMAX + 2][DMAX + 2], L1[DMAX + 2][DMAX + 2]; ///Labirintul

pozitie C1[DMAX * DMAX + 1]; ///Coada
int p, u, tmin = 1000000, x, y;

pozitie pr;
pozitie pj;

int d[8][2] = {{0, -1}, { -1, 0}, {0, 1}, {1, 0}, {1, 1}, { -1, -1}, { -1, 1}, {1, -1}}; ///Modalitati de deplasare


void bordare()
{
    int i;
    for(i = 0; i <= N + 1; i++)
        L[i][0] = L[i][M + 1] = -1;
    for(i = 0; i <= M + 1; i++)
        L[0][i] = L[N + 1][i] = -1;
}


void Lee(pozitie pstart, int L1[][DMAX + 2])
{
    pozitie vec, crt;
    p = u = 1;
    C1[1] = pstart;
    L1[pstart.x][pstart.y] = 1;
    while(p <= u)
    {
        crt = C1[p++];
        for(int k = 0; k < 8; k++)
        {
            vec.x = crt.x + d[k][0];
            vec.y = crt.y + d[k][1];
            if(L1[vec.x][vec.y] == 0)
            {
                L1[vec.x][vec.y] = L1[crt.x][crt.y] + 1;
                C1[++u] = vec;
            }
        }
    }
}


void citire()
{
    char c[DMAX+2];
    f >> N >> M;
    f.get();
    for(int i = 1; i <= N; i++)
    {
        f.getline(c+1,DMAX+1);
        for(int j = 1; j <= M; j++)
        {
            switch(c[j])
            {
            case 'X':///Perete
                L[i][j] = -1;
                break;
            case 'R':///Pozitie Romeo
                pr.x = i;
                pr.y = j;
                L[i][j] = 0;
                break;
            case 'J':///Pozitie Julieta
                pj.x = i;
                pj.y = j;
                L[i][j] = 0;
            }
        }
    }

}

int main()
{
    citire();
    bordare();
    /**cout<<N<<' '<<M<<'\n';
    for(int i = 0; i <= N+1; i++)
    {
        for(int j = 0; j <= M+1; j++)
            cout << L[i][j] << ' ';
        cout << '\n';
    }*/
    for(int i = 0; i <= N + 1; i++)
        for(int j = 0; j <= M + 1; j++)
            L1[i][j] = L[i][j]; ///Copiere matrice
    Lee(pr, L);
    Lee(pj, L1);
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++)
        {
            if(L[i][j] > 0 && L1[i][j] == L[i][j] && L[i][j] < tmin)
            {
                tmin = L[i][j];
                x = i;
                y = j;
            }
        }///Det punctului de intalnire
    g << tmin << ' ' << x << ' ' << y;
}