Cod sursă (job #111819)

Utilizator avatar andreea_zaharia Zaharia Andreea andreea_zaharia IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,22 kb
Rundă Tema 14 clasele 9-10 2014/15 Status evaluat
Dată 29 ian. 2015 13:03:33 Scor 70
#include <cstdio>

#define N 20
#define I 15

struct pozSt {int linI, colI, linF, colF;} stiva[I +1];
struct poz {int lin, col;} vims[I +1];

int a[N +2][N +2], flag = 0;
int n, m, imm;
int dl[] = {0, 0, 1, 0, -1}, dc[] = {0, 1, 0, -1, 0};

void bordare () {
    for (int i = 0; i <= n +1; i++) {
        a[i][0] = a[i][m +1] = -1;
    }
    for (int j = 0; j <= m +1; j++) {
        a[0][j] = a[n +1][j] = -1;
    }
}

int vecin (int x, int y) {
    for (int i = 1; i <= 4; i++) {
        if (a[x + dl[i]][y + dc[i]] == 1) {
            return i;
        }
    }

    return 0;
}

void afisare () {
    for (int i = 1; i < imm; i++) {
        printf ("%d %d %d %d\n", stiva[i].linI, stiva[i].colI, stiva[i].linF, stiva[i].colF);
    }
}

void backtrack (int k) {
    if (flag == 1) {
        return;
    }

    if (k == imm -1) {
        afisare ();
        flag = 1;
    }
    else {
        int i, j;
        for (int p = 1; p <= imm; p++) {
            if (vims[p].lin != 0) {
                i = vims[p].lin;
                j = vims[p].col;
                int v;
                v = vecin (i, j);
                if (a[i][j] == 1 && v != 0 && a[i + 2* dl[v]][j + 2* dc[v]] == 0) {
                    k++;
                    stiva[k].linI = i;
                    stiva[k].colI = j;
                    stiva[k].linF = i + 2* dl[v];
                    stiva[k].colF = j + 2* dc[v];

                    a[i + dl[v]][j + dc[v]] = 0;
                    a[i + 2* dl[v]][j + 2* dc[v]] = 1;
                    a[i][j] = 0;

                    vims[p].lin = i + 2* dl[v];
                    vims[p].col = j + 2* dc[v];


                    backtrack (k);

                    a[i + dl[v]][j + dc[v]] = 1;
                    a[i + 2* dl[v]][j + 2* dc[v]] = 0;
                    a[i][j] = 1;
                    vims[p].lin = i;
                    vims[p].col = j;
                    k--;
                }
            }
        }
    }
}

int main () {
    freopen ("immortal.in", "r", stdin);
    freopen ("immortal.out", "w", stdout);
    scanf ("%d%d%d", &n, &m, &imm);
    for (int i = 1; i <= imm; i++) {
        scanf ("%d%d", &vims[i].lin, &vims[i].col);
        a[vims[i].lin][vims[i].col] = 1;
    }

    bordare ();
    backtrack (0);

    return 0;
}