Cod sursa(job #2323124)

Utilizator Andrei_RAndrei Roceanu Andrei_R Data 18 ianuarie 2019 20:57:17
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.12 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

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

int mp[101][101], rm[101][101], jl[101][101], mi, done, am, m, n;


void romeo( int i, int j, int d ) {
    if ( rm[i][j+1] == 0 && j+1 < m ) {
        rm[i][j+1] = d;
        romeo( i, j+1, d+1 );
    }
    if ( rm[i+1][j+1] == 0 && j+1 < m && i+1 < n ) {
        rm[i+1][j+1] = d;
        romeo( i+1, j+1, d+1 );
    }
    if ( rm[i+1][j] == 0 && i+1 < n ) {
        rm[i+1][j] = d;
        romeo( i+1, j, d+1 );
    }
    if ( rm[i+1][j-1] == 0 && i+1 < n && j-1 >= 0 ) { // 4
        rm[i+1][j-1] = d;
        romeo( i+1, j-1, d+1 );
    }
    if ( rm[i][j-1] == 0 && j-1 >= 0 ) {
        rm[i][j-1] = d;
        romeo( i, j-1, d+1 );
    }
    if ( rm[i-1][j-1] == 0 && i-1 >= 0 && j-1 >= 0 ) { //6
        rm[i-1][j-1] = d;
        romeo( i-1, j-1, d+1 );
    }
    if ( rm[i-1][j] == 0 && i-1 >= 0 ) {
        rm[i-1][j] = d;
        romeo( i-1, j, d+1 );
    }
    if ( rm[i-1][j+1] == 0 && i-1 >= 0 && j+1 < m ) {
        rm[i-1][j+1] = d;
        romeo( i-1, j+1, d+1 );
    }
}

void julieta( int i, int j, int d ) { // YYEEEEEESSSSSSSSS
    if ( jl[i][j+1] == 0 && j+1 < m ) {
        jl[i][j+1] = d;
        if ( jl[i][j+1] == rm[i][j+1] && jl[i][j+1] < mi ) {
            mi = jl[i][j+1];
            done = i;
            am = j+1;
        }
        julieta( i, j+1, d+1 );
    }
    if ( jl[i+1][j+1] == 0 && j+1 < m && i+1 < n ) {
        jl[i+1][j+1] = d;
        if ( jl[i+1][j+1] == rm[i+1][j+1] && jl[i+1][j+1] < mi ) {
            mi = jl[i+1][j+1];
            done = i+1;
            am = j+1;
        }
        julieta( i+1, j+1, d+1 );
    }
    if ( jl[i+1][j] == 0 && i+1 < n ) {
        jl[i+1][j] = d;
        if ( jl[i+1][j] == rm[i+1][j] && jl[i+1][j] < mi ) {
            mi = jl[i+1][j];
            done = i+1;
            am = j;
        }
        julieta( i+1, j, d+1 );
    }
    if ( jl[i+1][j-1] == 0 && i+1 < n && j-1 >= 0 ) {
        jl[i+1][j-1] = d;
        if ( jl[i+1][j-1] == rm[i+1][j-1] && jl[i+1][j-1] < mi ) {
            mi = jl[i+1][j-1];
            done = i+1;
            am = j-1;
        }
        julieta( i+1, j-1, d+1 );
    }
    if ( jl[i][j-1] == 0 && j-1 >= 0 ) {
        jl[i][j-1] = d;
        if ( jl[i][j-1] == rm[i][j-1] && jl[i][j-1] < mi ) {
            mi = jl[i][j-1];
            done = i;
            am = j-1;
        }
        julieta( i, j-1, d+1 );
    }
    if ( jl[i-1][j-1] == 0 && i-1 >= 0 && j-1 >= 0 ) {
        jl[i-1][j-1] = d;
        if ( jl[i-1][j-1] == rm[i-1][j-1] && jl[i-1][j-1] < mi ) {
            mi = jl[i-1][j-1];
            done = i-1;
            am = j-1;
        }
        julieta( i-1, j-1, d+1 );
    }
    if ( jl[i-1][j] == 0  && i-1 >= 0 ) {
        jl[i-1][j] = d;
        if ( jl[i-1][j] == rm[i-1][j] && jl[i-1][j] < mi ) {
            mi = jl[i-1][j];
            done = i-1;
            am = j;
        }
        julieta( i-1, j, d+1 );
    }
    if ( jl[i-1][j+1] == 0 && i-1 >= 0 && j+1 < m ) {
        jl[i-1][j+1] = d;
        if ( jl[i-1][j+1] == rm[i-1][j+1] && jl[i-1][j+1] < mi ) {
            mi = jl[i-1][j+1];
            done = i-1;
            am = j+1;
        }
        julieta( i-1, j+1, d+1 );
    }
}

struct art{
    int x, y;
};

art k1, k2;

int main()
{
    mi = 1000000;
    char c[101];
    int i, j;
    in >> n >> m;
    in.getline(c, 101);
    for ( i = 0; i < n; i++ ) {
        in.getline(c, 101);
        for ( j = 0; j < m; j++ ) {
            if ( c[j] == 'X' ) {
                mp[i][j] = jl[i][j] = rm[i][j] = -1;
            }
            else if ( c[j] == 'J' ) {
                k2.x = i;
                k2.y = j;
                mp[i][j] = jl[i][j] = rm[i][j] = -1;
            }
            else if ( c[j] == 'R' ) {
                k1.x = i;
                k1.y = j;
                mp[i][j] = jl[i][j] = rm[i][j] = -1;
            }
        }
    }
    romeo( k1.x, k1.y, 1);
    julieta( k2.x, k2.y, 1);
    out << mi << " " << done+1 << " " << am+1;
    return 0;
}