Cod sursa(job #1023452)

Utilizator pop_bogdanBogdan Pop pop_bogdan Data 6 noiembrie 2013 23:10:38
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.24 kb
#include <fstream>
#include <iomanip>
using namespace std;

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

int x[102][102];
int x2[102][102];
int x3[102][102];
int rp1,rp2,jp1,jp2;
int n,m;
int vecin1[] = {-1,-1,0,1,1,1,0,-1};
int vecin2[] = {0,1,1,1,0,-1,-1,-1};
int minim = 999999;
int u1,u2;

bool Ok1( int i, int j)
{
    if ( i < 1 || j < 1 || i > n || j > m )
    return false;
    if ( x[i][j] != 0 )
    return false;
    return true;
}
bool Ok2( int i, int j)
{
    if ( i < 1 || j < 1 || i > n || j > m )
    return false;
    if ( x2[i][j] != 0 )
    return false;
    return true;
}

void Read()
{
    char v;
    is >> n >> m;
    is.get(v);
    for ( int i = 1; i <= n; i++ )
    {
        for ( int j = 1; j <= m; j++ )
        {
            is.get(v);
            if ( int(v) == 88 )
            {
            x[i][j] = -1;
            x2[i][j] = -1;
            }
            if ( int(v) == 82 )
            {
            x[i][j] = 0;
            x2[i][j] = 0;
            rp1 = i;
            rp2 = j;
            }
            if ( int(v) == 32 )
            {
            x[i][j] = 0;
            x2[i][j] = 0;
            }
            if ( int(v) == 74 )
            {
            x[i][j] = 0;
            x2[i][j] = 0;
            jp1 = i;
            jp2 = j;
            }
        }
        is.get(v);
    }
}

void Lee1()
{
    int pas(1);
    int y1,y2;
    bool modif = true;
    while ( modif )
    {
        modif = false;
        for ( int i = 1; i <= n; i++ )
        {
            for ( int j = 1; j <= m; j++ )
            {
                if ( x[i][j] == pas )
                {
                    modif = true;
                    for ( int d = 0; d < 8; d++ )
                    {
                        y1 = i + vecin1[d];
                        y2 = j + vecin2[d];
                        if ( Ok1(y1,y2) )
                        x[y1][y2] = pas+1;
                    }
                }
            }
        }
        pas++;
    }
}
void Lee2()
{
    int pas(1);
    int y1,y2;
    bool modif = true;
    while ( modif )
    {
        modif = false;
        for ( int i = 1; i <= n; i++ )
        {
            for ( int j = 1; j <= m; j++ )
            {
                if ( x2[i][j] == pas )
                {
                    modif = true;
                    for ( int d = 0; d < 8; d++ )
                    {
                        y1 = i + vecin1[d];
                        y2 = j + vecin2[d];
                        if ( Ok2(y1,y2) )
                        x2[y1][y2] = pas+1;
                    }
                }
            }
        }
        pas++;
    }
}
void Verify()
{
    for ( int i = 1; i <= n; i++ )
        for ( int j = 1; j <= m; j++ )
        {
            if ( x[i][j] == x2[i][j] && x[i][j] > 0  )
            {
                if ( x[i][j] < minim )
                {
                minim = x[i][j];
                u1 = i;
                u2 = j;
                }
            }
        }
}
int main()
{
    Read();
    x[rp1][rp2] = 1;
    x2[jp1][jp2] = 1;
    Lee1();
    Lee2();
    Verify();
    os << minim << " ";
    os << u1 << " ";
    os << u2;

    return 0;
}