Cod sursă (job #668960)

Utilizator avatar VladS BRING BACK VARENA.RO VladS IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp-32 | 2,16 kb
Rundă Tema BKT Status evaluat
Dată 13 oct. 2022 11:55:11 Scor 20
#include <fstream>

using namespace std;

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

const int NMAX = 500;

struct MOVE
{
    int i1, j1, i2, j2;
};
MOVE sol[NMAX + 5];


struct ENTITY
{
    int pI, pJ;
}pos[NMAX + 5];

int n, m, cnt;
int soldiers;
pair<int, int> dk[4] = { make_pair(-1, 0),  make_pair(0, 1),  make_pair(1, 0),  make_pair(0, -1)};

bool v[NMAX + 5][NMAX + 5];

bool OK(int i, int j)
{
    return (i >= 1 && i <= n && j >= 1 && j <= m && v[i][j] == 0);
}

bool solved;

void bkt(int k)
{
    if (cnt == 1 && !solved)
    {
        for (int i = 1; i < soldiers; i++)
        {
            cout << sol[i].i1 << ' ' << sol[i].j1 << ' ' << sol[i].i2 << ' ' << sol[i].j2 << '\n';
        }
        solved = 1;
    }
    else if (!solved)
    {
        for (int i = 1; i <= soldiers; i++)
        {

            int I = pos[i].pI;
            int J = pos[i].pJ;
            if (v[I][J] == 1)
            {
                for (int t = 0; t < 4; t++)
                {
                    int newI = I + dk[t].first;

                    int newJ = J + dk[t].second;
                    sol[k] = { I, J, newI + dk[t].first, newJ + dk[t].second };

                    if(v[newI][newJ] == 1 && OK(newI + dk[t].first, newJ + dk[t].second)){

                        v[newI][newJ] = 0;
                        v[I][J] = 0;
                        v[newI + dk[t].first][newJ + dk[t].second] = 1;
                        pos[i] = { newI + dk[t].first, newJ + dk[t].second };

                        cnt--;
                        if(cnt >= 1)
                            bkt(k + 1);
                        cnt++;

                        pos[i]= { I, J };
                        v[newI][newJ] = 1;
                        v[I][J] = 1;
                        v[newI + dk[t].first][newJ  + dk[t].second] = 0;
                    }
                }
            }

        }
    }
}

int main()
{
    cin >> n >> m >> cnt;
    soldiers = cnt;
    for (int i = 1; i <= cnt; i++)
    {
        cin >> pos[i].pI >> pos[i].pJ;
        v[pos[i].pI][pos[i].pJ] = 1;
    }
    bkt(1);
    return 0;
}