Cod sursa(job #1980920)

Utilizator FlepperinoAlex Murariu Flepperino Data 14 mai 2017 13:17:48
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
#define Nmax 101

void citire(int &n, int &m, int R[][Nmax], int J[][Nmax], int &lr, int &cr, int &lj, int &cj)
{
    int i, j;
    char linie[Nmax];
    ifstream f("rj.in");
    f >> n >> m;
    f.get();
    for(i = 1; i <= n; i++)
    {
        f.getline(linie, Nmax, '\n');
        for(j = 0; j < m; j++)
        {
            if(linie[j] == 'R')
            {
                lr = i;
                cr = j + 1;
                J[lr][cr] = 0;
            }
            if(linie[j] == 'J')
            {
                lj = i;
                cj = j + 1;
                R[lj][cj] = 0;
            }
            if(linie[j] == '#')
            {
                R[i][j + 1] = 0;
                J[i][j + 1] = 0;
            }
            if(linie[j] == 'X')
            {
                R[i][j + 1] = -1;
                J[i][j + 1] = -1;
            }
        }
    }
    f.close();
}

int bune(int ii, int jj, int n, int m)
{
    return((ii >= 1 && ii <= n) && (jj >= 1 && jj <= m));
}

void lee(int n, int m, int R[][Nmax], int lr, int cr)
{
    int cx[10000], cy[10000], pi, ps, ii, jj, k;
    cx[0] = lr;
    cy[0] = cr;
    R[lr][cr] = 1;
    pi = 0;
    ps = 0;
    while(pi <= ps)
    {
        for(k = 0; k < 8; k++)
        {
            ii = cx[pi] + dx[k];
            jj = cy[pi] + dy[k];
            if(bune(ii, jj, n, m))
                if(R[ii][jj] == 0)
                 {
                    R[ii][jj] = R[cx[pi]][cy[pi]] + 1;
                    ps++;
                    cx[ps] = ii;
                    cy[ps] = jj;
                 }
        }
        pi++;
    }
}

void min_afis(int n, int m, int R[][Nmax], int J[][Nmax])
{
    int i, j, minn, ii, jj;
    minn = 10001;
    for(i = 1; i <= n; i++)
        for(j = 1; j <= m; j++)
         if(R[i][j] == J[i][j])
          if(R[i][j] > 0)
           if(R[i][j] < minn)
            {
             minn = R[i][j];
             ii = i;
             jj = j;
            }
    ofstream g("rj.out");
    g << minn << " " << ii << " " << jj;
    g.close();
}

int main()
{
    int R[Nmax][Nmax], J[Nmax][Nmax], n, m, lr, cr, lj, cj;
    citire(n, m, R, J, lr, cr, lj, cj);
    lee(n, m, R, lr, cr);
    lee(n, m, J, lj, cj);
    min_afis(n, m, R, J);
    return 0;
}