Cod sursa(job #2853340)

Utilizator petru-robuRobu Petru petru-robu Data 20 februarie 2022 10:45:51
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.48 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");

struct coord
{
    int x,y;
};

int n, m, rom[105][105], jul[105][105];
coord rs, js, dir[8], meet;

void citire()
{
    fin >> n >> m;
    fin.get();
    for (int i = 1; i <= n; i++)
    {
        char ch[101];
        fin.getline(ch, m + 1);
        for (int j = 0; j < m; j++)
        {
            if (ch[j] == 'X')
            {
                rom[i][j+1]=-1;
                jul[i][j+1]=-1;
            }
            if (ch[j] == 'R')
            {
                rs.x=i;
                rs.y=j+1;
            }
            if (ch[j] == 'J')
            {
                js.x=i;
                js.y=j+1;
            }
        }
    }

    for(int j=0; j<=n; j++)
    {
        rom[0][j]=-1;
        rom[n+1][j]=-1;
        rom[j][0]=-1;
        rom[j][n+1]=-1;
        jul[0][j]=-1;
        jul[n+1][j]=-1;
        jul[j][0]=-1;
        jul[j][n+1]=-1;
    }
}

void dirset()
{
    dir[0].x=0;
    dir[0].y=-1;
    dir[1].x=-1;
    dir[1].y=0;
    dir[2].x=0;
    dir[2].y=1;
    dir[3].x=1;
    dir[3].y=0;
    dir[4].x=1;
    dir[4].y=1;
    dir[5].x=-1;
    dir[5].y=-1;
    dir[6].x=-1;
    dir[6].y=1;
    dir[7].x=1;
    dir[7].y=-1;
}

void leeRomeo()
{
    queue<coord> q;
    coord el, next;
    q.push(rs);
    rom[rs.x][rs.y]=1;
    while(!q.empty())
    {
        el=q.front();
        q.pop();
        for(int i=0; i<8; i++)
        {
            next.x=el.x+dir[i].x;
            next.y=el.y+dir[i].y;
            if(rom[next.x][next.y]==0)
            {
                q.push(next);
                rom[next.x][next.y]=rom[el.x][el.y]+1;
            }
        }
    }
}

void leeJulieta()
{
    queue<coord> q;
    coord el, next;
    q.push(js);
    jul[js.x][js.y]=1;
    while(!q.empty())
    {
        el=q.front();
        q.pop();
        for(int i=0; i<8; i++)
        {
            next.x=el.x+dir[i].x;
            next.y=el.y+dir[i].y;
            if(jul[next.x][next.y]==0)
            {
                q.push(next);
                jul[next.x][next.y]=jul[el.x][el.y]+1;
            }
        }
    }
}


int main()
{
    citire();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cout<<jul[i][j]<<' ';
        }
        cout<<'\n';
    }
    cout<<'\n';

    dirset();
    leeRomeo();
    leeJulieta();

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cout<<rom[i][j]<<' ';
        }
        cout<<'\n';
    }
    cout<<'\n';

    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cout<<jul[i][j]<<' ';
        }
        cout<<'\n';
    }
    cout<<'\n';

    int sol=1;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            if(rom[i][j]>0&&rom[i][j]==jul[i][j])
            {
                if(sol)
                {
                    meet.x=i;meet.y=j;
                    sol = 0;
                }
                else
                {
                    if(jul[i][j] < jul[meet.x][meet.y])
                    {
                        meet.x=i;
                        meet.y=j;
                    }
                }
            }
        }

    }
    cout<<jul[meet.x][meet.y]<<' '<<meet.x<<' '<<meet.y;
    fout<<jul[meet.x][meet.y]<<' '<<meet.x<<' '<<meet.y;

    return 0;
}