Cod sursa(job #1060710)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 18 decembrie 2013 15:29:53
Problema Rj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <cstdio>
#include <algorithm>

#define INF 2000000000

using namespace std;

int dx[] = {0,  0, 1, -1, 1, -1,  1, -1}, rr[128][128], jj[128][128];
int dy[] = {1, -1, 0,  0, 1, -1, -1,  1};

int main ()
{
    freopen ("rj.in", "r", stdin);
    freopen ("rj.out", "w", stdout);

    int n, m;

    scanf ("%d %d\n", &n, &m);

    for (int i = 1; i <= n; i++)
    {
        char c;

        for (int j = 1; j <= m; j++)
        {
            scanf ("%c", &c);

            if (c == 'X') rr[i][j] = jj[i][j] = -1;
            else if (c == ' ') rr[i][j] = jj[i][j] = INF;
            else if (c == 'R') rr[i][j] = 1, jj[i][j] = INF;
            else if (c == 'J') jj[i][j] = 1, rr[i][j] = INF;
        }

        scanf ("%c", &c);
    }

    for (int i = 0; i <= n + 1; i++)
        rr[i][0] = jj[i][0] = rr[i][m + 1] = jj[i][m + 1] = -1;

    for (int i = 0; i <= m + 1; i++)
        rr[0][i] = jj[0][i] = rr[n + 1][i] = jj[n + 1][i] = -1;

    bool OK = true;
    for (int h = 1; OK; h++)
    {
        OK = false;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
            {
                if (rr[i][j] == h)
                {
                    for (int k = 0; k < 8; k++)
                        rr[dx[k] + i][dy[k] + j] = min (h + 1, rr[dx[k] + i][dy[k] + j]);

                    OK = true;
                }
            }
    }

    OK = true;
    for (int h = 1; OK; h++)
    {
        OK = false;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
            {
                if (jj[i][j] == h)
                {
                    for (int k = 0; k < 8; k++)
                        jj[dx[k] + i][dy[k] + j] = min (h + 1, jj[dx[k] + i][dy[k] + j]);

                    OK = true;
                }
            }
    }

    int mi = INF, x, y;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            if (rr[i][j] == jj[i][j] && rr[i][j] > 0 && mi > rr[i][j]) mi = rr[i][j], x = i, y = j;

    /*for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            printf ("%d ", rr[i][j]);

        printf ("\n");
    }

    printf ("\n");

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
            printf ("%d ", jj[i][j]);

        printf ("\n");
    }*/

    printf ("%d ", mi);
    printf ("%d ", x);
    printf ("%d\n", y);

    return 0;
}