Cod sursă (job #643596)

Utilizator avatar ssss Ismana Andrei Stefan ssss IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp-32 | 2,51 kb
Rundă Arhiva de probleme Status evaluat
Dată 25 mar. 2022 10:51:52 Scor 80
#include <bits/stdc++.h>

using namespace std;

ifstream in("immortal.in");
ofstream out("immortal.out");

struct nemuritor{
    int ox, oy;
} nem[20];

struct mystack{
    int ox, oy, dir;
}rasp[20];

int camp[25][25];

const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

int n, m, k;

void afis(){
    for(int i = k; i > 1; --i)
        out << rasp[i].ox - 1 << ' ' << rasp[i].oy - 1 << ' ' << rasp[i].ox + 2 * dx[rasp[i].dir] - 1 << ' ' << rasp[i].oy + 2 * dy[rasp[i].dir] - 1 << endl;
    exit(0);
}

void lupta(int k){
    if(k == 1)
        afis();
    for(int i = 0; i < k; ++i){
        int lin = nem[i].ox, col = nem[i].oy;
        for(int d = 0; d <= 3; ++d){
            int nextx = nem[i].ox + dx[d], nexty = nem[i].oy + dy[d];
            int nextnx = nextx + dx[d], nextny = nexty + dy[d];

            if(camp[nextx][nexty] > -1 && camp[nextnx][nextny] == -1){
                rasp[k] = {lin, col, d};
                camp[lin][col] = -1;
                nem[i] = {nextnx, nextny};
                camp[nextnx][nextny] = i;

                int mort = camp[nextx][nexty];
                if(mort < k - 1){
                    nem[mort] = nem[k - 1];
                    camp[nem[mort].ox][nem[mort].oy] = mort;
                }
                camp[nextx][nexty] = -1;

                lupta(k - 1);

                if(mort < k - 1){
                    nem[k - 1] = nem[mort];
                    camp[nem[k - 1].ox][nem[k - 1].oy] = k - 1;
                    nem[mort] = {nextx, nexty};
                }

                camp[nextx][nexty] = mort;
                camp[nextnx][nextny] = -1;
                nem[i] = {lin, col};
                camp[lin][col] = i;
            }
        }
    }
}

int main()
{
    in >> n >> m >> k;
    for(int i = 2; i <= m + 1; ++i)
        camp[0][i] = camp[1][i] = camp[n + 2][i] = camp[n + 3][i] = k + 1;
    for(int i = 2; i <= n + 1; ++i)
        camp[i][0] = camp[i][1] = camp[i][m + 2] = camp[i][m + 3] = k + 1;
    for(int i = 2; i <= n + 1; ++i)
        for(int j = 2; j <= m + 1; j++)
            camp[i][j] = -1;
    int x, y;
    for(int i = 0; i < k; ++i){
        in >> x >> y;
        camp[x + 1][y + 1] = 1;
    }
    k = 0;
    for(int i = 2; i <= n + 1; ++i){
        for(int j = 2; j <= m + 1; ++j)
            if(camp[i][j] == 1){
                nem[k].ox = i;
                nem[k].oy = j;
                camp[i][j] = k;
                k++;
            }
    }
    lupta(k);
    return 0;
}