Cod sursa(job #2353361)

Utilizator mihaidanielmihai daniel mihaidaniel Data 24 februarie 2019 11:20:03
Problema Rj Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.18 kb
#include <cstdio>
#include <queue>
#define MAX 0xffffff

using namespace std;

int mat[102][102], n, m;

void af()
{
    int i, j;
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= m; ++j)
        {
            if (mat[i][j] == -1) {printf ("X ");}
            else {printf ("%d ", (mat[i][j] == MAX) ? 0 : mat[i][j]);}
        }
        printf ("\n");
    }
    printf ("\n");
}

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

    int i, j, k, rx, ry, rb = 0, jx, jy, jb = 0;
    const int ii[8] = {-1,-1,-1, 0, 0, 1, 1, 1};
    const int jj[8] = {-1, 0, 1,-1, 1,-1, 0, 1};
    queue <pair <int, int> > q;

    scanf ("%d%d", &n, &m);
    if (n > 100 || m > 100)
    {
        printf ("TO BIGGGGG");
        return 0;
    }
    getchar();
    for (i = 1; i <= n; ++i)
    {
        for (j = 1; j <= m; ++j)
        {
            char c;
            switch (c = getchar())
            {
            case 'X':
                mat[i][j] = -1;
                break;
            case ' ':
                mat[i][j] = MAX;
                break;
            case '\n':
                for ( ; j <= m; ++j)
                {
                    mat[i][j] = MAX;
                }
                ++j;
                break;
            case 'R':
                mat[i][j] = 1;
                rx = i;
                ry = j;
                ++rb;
                break;
            case 'J':
                mat[i][j] = MAX;
                jx = i;
                jy = j;
                ++jb;
                break;
            case -1:
                for ( ; i <= n; ++i)
                {
                    for (j = 1; j <= m; ++j)
                    {
                        mat[i][j] = MAX;
                    }
                }
                break;
            default:
                printf ("WTF!! I don't know...");
                return 0;
            }
        }
        if (j == m + 1) {getchar();}
    }

    if (rb != 1 || jb != 1)
    {
        printf ("Wait... What??");
        return 0;
    }

    q.push (pair <int,int> (rx, ry));
    while (!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for (k = 0; k < 8; ++k)
        {
            if (mat[i+ii[k]][j+jj[k]] == MAX)
            {
                mat[i+ii[k]][j+jj[k]] = mat[i][j] + 1;
                if (1 || i+ii[k] != jx || j+jj[k] != jy)
                {
                    q.push (pair <int, int> (i+ii[k], j+jj[k]));
                }
                else
                {
                    while (!q.empty()) {q.pop();}
                }
            }
        }
    }

    if (mat[jx][jy] == MAX)
    {
        printf ("YOU IDIOT");
        return 0;
    }

    int nr = (mat[jx][jy] + 1) / 2, cnr;
    cnr = nr;
    while (--cnr)
    {
        for (k = 0; k < 8; ++k)
        {
            if (mat[jx+ii[k]][jy+jj[k]] + 1 == mat[jx][jy])
            {
                jx += ii[k];
                jy += jj[k];
                break;
            }
        }
    }

    printf ("%d %d %d", nr, jx, jy);
    return 0;
}