#include #include #define MAX_N 14 FILE *f; int n, numSol; char sol[MAX_N]; // vectorul soluție char col[MAX_N]; // vectorul de ocupare a coloanelor char diag[2 * MAX_N]; // vectorul de ocupare a diagonalelor principale char anti[2 * MAX_N]; // vectorul de ocupare a diagonalelor secundare void backtrack(int k) { if (k == n) { if (++numSol <= 3) { for (int i = 0; i < n; i++) { fprintf(f, "%d ", 1 + sol[i]); } fprintf(f, "\n"); } } else { for (int i = 0; i < n; i++) { if (!col[i] && !diag[k - i + n - 1] && !anti[k + i]) { sol[k] = i; col[i] = diag[k - i + n - 1] = anti[k + i] = 1; backtrack(k + 1); col[i] = diag[k - i + n - 1] = anti[k + i] = 0; } } } } int main(void) { f = fopen("regine.in", "r"); assert(fscanf(f, "%d", &n) == 1); fclose(f); f = fopen("regine.out", "w"); backtrack(0); fprintf(f, "%d\n", numSol); fclose(f); }