Cod sursă (job #126815)

Utilizator avatar Epictet Stamatin Cristian Epictet IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,15 kb
Rundă Arhiva de probleme Status evaluat
Dată 3 mar. 2015 15:01:18 Scor 0
#include <fstream>
#define x first
#define y second
using namespace std;
ifstream fin ("immortal.in");
ofstream fout ("immortal.out");
struct sol { int px, py, sx, sy; } S[410];
const int dl[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };
int N, M, I, V[22][22];
pair < int, int > A[410];
bool fr[410];

bool Verif(int i, int j)
{
    if (i < 1 || i > N || j < 1 || j > M) return 0;
    return 1;
}

void Afis()
{
    for (int i = I; i >= 2; i--)
    {
        fout << S[i].px << ' ' << S[i].py << ' ';
        fout << S[i].sx << ' ' << S[i].sy << '\n';
    }
    fout.close();
}

int Cauta(int i, int j)
{
    for (int p = 1; p <= I; p++)
    {
        if (A[p].x == i && A[p].y == j) return p;
    }
}

void Back(int k)
{
    if (k == 1)
    {
        Afis();
        return;
    }
    else
    {
        for (int i = 1; i <= I; i++)
        {
            if (!fr[i])
            {
                for (int p = 0; p < 4; p++)
                {
                    int ii = A[i].x + dl[p];
                    int jj = A[i].y + dc[p];

                    if (Verif(ii, jj) && Verif(ii + dl[p], jj + dc[p]) && V[ii][jj] && !V[ii + dl[p]][jj + dc[p]])
                    {
                        int j = Cauta(ii, jj);
                        fr[j] = 1;
                        V[A[i].x][A[i].y] = 0;
                        S[k].px = A[i].x;
                        S[k].py = A[i].y;
                        A[i].x = ii + dl[p];
                        A[i].y = jj + dc[p];
                        S[k].sx = A[i].x;
                        S[k].sy = A[i].y;
                        V[ii][jj] = 0;
                        V[A[i].x][A[i].y] = 1;
                        Back(k - 1);
                        V[ii][jj] = 1;
                        V[A[i].x][A[i].y] = 0;
                        A[i].x = ii - dl[p];
                        A[i].y = jj - dc[p];
                        V[A[i].x][A[i].y] = 1;
                        fr[j] = 0;
                    }
                }
            }
        }
    }
}

int main()
{
    fin >> N >> M >> I;
    for (int i = 1; i <= I; i++)
    {
        fin >> A[i].x >> A[i].y;
        V[A[i].x][A[i].y] = 1;
    }

    Back(I);

    return 0;
}