Cod sursa(job #1279931)

Utilizator juniorOvidiu Rosca junior Data 1 decembrie 2014 03:52:11
Problema Problema Damelor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <cmath>

using namespace std;

int n, a[14], ns;
bool prima = true;
ifstream fin("damesah.in");
ofstream fout("damesah.out");

void init (int k) {
  a[k] = 0; // Punem langa tabla (in stanga) piesa de pe linia k.
}

bool succesor (int k) {
  a[k]++;           // Deplasam piesa cu o coloana mai in dreapta.
  return a[k] <= n; // Piesa ramane pe tabla?
}

bool valid (int k) {
  bool ok = true; // Presupunem ca piesele nu se ataca.
  int i;
  for (i = 1; i <= k - 1; i++) // Pentru fiecare piesa pusa deja
    if ((a[i] == a[k]) or (abs(a[k] - a[i]) == k - i)) // Avem atac pe coloane sau diagonale?
      ok = false; // Nu ne convine pozitia piesei din linia k.
  return ok;
}

bool sol (int k) {
  return k == n; // Am pus piese pe toate liniile?
}

void tip () {
  int i;
  for (i = 1; i <= n; i++)
    fout << a[i] << ' ';
  fout << '\n';
  prima = false;
}

void bt (int k) {
  init (k);           // initializare
  while (succesor(k)) // cat timp avem un succesor
    if (valid(k))     // Sunt indeplinite conditiile?
      if (sol(k)) {    // Avem o solutie completa?
        ns++;
        if (prima)
          tip();        // Prezentam solutia.
      }
      else            // Nu?
        bt(k + 1);    // Trecem la nivelul urmator.
}

int main () {
  fin >> n;
  bt(1);
  fout << ns;
}