Cod sursa(job #2443027)

Utilizator RaduAndreiGRadu Andrei RaduAndreiG Data 26 iulie 2019 11:46:48
Problema Problema Damelor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
using namespace std;

int n;

int pozDame[13];

void Citire() {
    cin >> n;
}

void Solutie(int v[13]) {
    for (int i = 0; i < n; i++)
        cout << v[i] << " ";
    cout << "\n";
}

int lin[13];
int col[13];
int diagSecundara[26];
int diagPrincipala[26];

bool isOK(int linie, int coloana) { // verifica daca pot pune dama in locul i,j;
    if (lin[linie] == 1) {
        return false;
    }
    if (col[coloana] == 1) {
        return false;
    }
    if (diagSecundara[linie+coloana] == 1) {
        return false;
    }
    if (diagPrincipala[coloana-linie+n] == 1) {
        return false;
    }
    return true;
}

void nuPuneAici(int linie, int coloana) { // marcheaza locurile in care nu mai pot pune dame
    lin[linie] = 1;
    col[coloana] = 1;
    diagSecundara[linie+coloana] = 1;
    diagPrincipala[coloana-linie+n] = 1;
}

void potiPuneAici(int linie, int coloana) {
    lin[linie] = 0;
    col[coloana] = 0;
    diagSecundara[linie+coloana] = 0;
    diagPrincipala[coloana-linie+n] = 0;
}

int damePlasate = 0;

int Solutii = 0;

void Rezolvare(int linie) {
    if (damePlasate == n) {
        Solutii++;
            if (Solutii == 1)
                Solutie(pozDame);
        return;
    }
    for (int j = 0; j < n; j++) {   // j = coloana
        if (isOK(linie, j)) {
            pozDame[linie] = j+1;
            nuPuneAici(linie, j);
            damePlasate++;
            Rezolvare(linie+1);
            pozDame[linie] = 0;
            potiPuneAici(linie, j);
            damePlasate--;
        }
    }
}

int main()
{
    Citire();
    Rezolvare(0);
    cout << Solutii;
    return 0;
}