Cod sursa(job #2030803)

Utilizator osiaccrCristian Osiac osiaccr Data 2 octombrie 2017 12:13:55
Problema Problema Damelor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define DEF 15

using namespace std;

ifstream fin ("damesah.in");
ofstream fout ("damesah.out");

int N[DEF][DEF], n, nr, v[DEF],
di[] = {1, -1, 0, 0, 1, -1, -1, 1},
dj[] = {1, -1, 1, -1, 0, 0, 1, -1};

void mark (int x, int y) {
    for (int d =0 ; d <= 7; d++)
        for (int i = x, j = y; j <= n && i <= n && j >= 1 && i >= 1; j += dj[d], i += di[d])
            N[i][j]++;
}

void demark (int x, int y) {
    for (int d =0 ; d <= 7; d++)
        for (int i = x, j = y; j <= n && i <= n && j >= 1 && i >= 1; j += dj[d], i += di[d])
            N[i][j]--;
}


void _back (int x, int y, int t) {
    if (t == 0) {
        nr++;
        if (nr == 1) {
            for (int i = 1; i <= n; i++)
                fout << v[i] << " ";
            fout << "\n";
        }
        return;
    }
    if (y > n) {
        _back (x + 1, 1, t);
        return;
    }
    if (x > n)
        return;
    if (N[x][y] != 0) {
        _back (x, y + 1, t);
        return;
    }
    mark (x, y);
    v[x] = y;
    _back (x + 1, 1, t - 1);
    demark (x, y);
    v[x] = 0;
    _back (x, y + 1, t);
}

int main () {
    fin >> n;
    _back (1, 1, n);
    fout << nr;
    return 0;
}