Pentru această operație este nevoie să te autentifici.

Cod sursă (job #295606)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,65 kb
Rundă Arhiva de probleme Status evaluat
Dată 26 mar. 2017 06:51:27 Scor 30
#include <cstdio>
#include <cstdlib>

using namespace std;

int mat[16][22][22];
int lim[16][16][2];
int lupte[16][4];
int nl, nc, nim;
int d[4][2] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};

void copyMatTo(int ind)
{
    int i, j;
    for(i = 0; i <= nl + 1; i++)
        for(j = 0; j <= nc + 1; j++)
            mat[ind][i][j] = mat[ind - 1][i][j];
}

void backr(int k)
{
    int i, j, p, x;
    if(k == nim - 1)
    {
        for(i = 0; i < k; i++)
        {
            printf("%d %d %d %d\n", lupte[i][0], lupte[i][1], lupte[i][2], lupte[i][3]);
        }
        exit(0);
    }
    for(i = 0; i < nim - k; i++)
    {
        for(j = 0; j < 4; j++)
        {
            if(mat[k][lim[k][i][0] + d[j][0]][lim[k][i][1] + d[j][1]] == 1)
            if(mat[k][lim[k][i][0] + d[j][0] * 2][lim[k][i][1] + d[j][1] * 2] == 0)
            {
                copyMatTo(k + 1);
                mat[k + 1][lim[k][i][0]][lim[k][i][1]] = 0;
                mat[k + 1][lim[k][i][0] + d[j][0]][lim[k][i][1] + d[j][1]] = 0;
                mat[k + 1][lim[k][i][0] + d[j][0] * 2][lim[k][i][1] + d[j][1] * 2] = 1;
                lupte[k][0] = lim[k][i][0];
                lupte[k][1] = lim[k][i][1];
                lupte[k][2] = lim[k][i][0] + d[j][0] * 2;
                lupte[k][3] = lim[k][i][1] + d[j][1] * 2;
                x = 0;
                for(p = 0; p < nim - k; p++)
                {
                    if(lim[k][p][0] == lim[k][i][0] && lim[k][p][1] == lim[k][i][1])
                    {
                        lim[k + 1][x][0] = lim[k][i][0] + d[j][0] * 2;
                        lim[k + 1][x][1] = lim[k][i][1] + d[j][1] * 2;
                        x++;
                    }
                    else if(lim[k][p][0] == lim[k][i][0] + d[j][0] && lim[k][p][1] == lim[k][i][1] + d[j][1]) continue;
                    else
                    {
                        lim[k + 1][x][0] = lim[k][p][0];
                        lim[k + 1][x][1] = lim[k][p][1];
                        x++;
                    }
                }
                backr(k + 1);
            }
        }
    }
}

int main()
{
    int i;
    freopen("immortal.in", "r", stdin);
    freopen("immortal.out", "w", stdout);
    scanf("%d%d%d", &nl, &nc, &nim);
    for(i = 0; i < nim; i++)
    {
        scanf("%d%d", &lim[0][i][0], &lim[0][i][1]);
        mat[0][lim[0][i][0]][lim[0][i][1]] = 1;
    }
    for(i = 0; i <= nl + 1; i++)
    {
        mat[0][i][0] = -1;
        mat[0][i][nc + 1] = -1;
    }
    for(i = 0; i <= nc + 1; i++)
    {
        mat[0][0][i] = -1;
        mat[0][nl + 1][i] = -1;
    }
    backr(0);
    return 0;
}