Cod sursă (job #126934)

Utilizator avatar Epictet Stamatin Cristian Epictet IP ascuns
Problemă Immortal (clasele 9-10) Compilator cpp | 2,24 kb
Rundă Arhiva de probleme Status evaluat
Dată 3 mar. 2015 16:27:24 Scor 30
#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;
pair < int, int > A[410];
bool w = 1, fr[410], V[22][22];

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

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

void Back(int k)
{
    if (k == 1)
    {
        for (int i = I; i >= 2; i--)
        {
            fout << S[i].px << ' ' << S[i].py << ' ' << S[i].sx << ' ' << S[i].sy << '\n';
        }
        fout.close();
        w = 0;
        return;
    }
    else
    {
        for (int i = 1; i <= I; i++)
        {
            if (!fr[i] && w)
            {
                int auxi = A[i].x;
                int auxj = A[i].y;
                for (int p = 0; p < 4; p++)
                {
                    int ii = auxi + dl[p];
                    int jj = auxj + dc[p];
                    int i_i = ii + dl[p];
                    int j_j = jj + dc[p];

                    if (Verif(ii, jj) && Verif(i_i, j_j) && V[ii][jj] && !V[i_i][j_j])
                    {
                        int j = Cauta(ii, jj);

                        S[k].px = auxi;
                        S[k].py = auxj;
                        S[k].sx = i_i;
                        S[k].sy = j_j;

                        V[auxi][auxj] = 0;
                        V[ii][jj] = 0;
                        V[i_i][j_j] = 1;
                        A[i].x = i_i;
                        A[i].y = j_j;
                        fr[j] = 1;

                        Back(k - 1);

                        V[auxi][auxj] = 1;
                        V[ii][jj] = 1;
                        V[i_i][j_j] = 0;
                        A[i].x = auxi;
                        A[i].y = auxj;
                        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;
}