Cod sursa(job #1490738)

Utilizator salam1Florin Salam salam1 Data 24 septembrie 2015 03:08:25
Problema Problema Damelor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#include <cstring>
const int NMAX = 15;
const int LMAX = 31;
bool markColumn[NMAX], markFstDiag[LMAX], markSndDiag[LMAX];
int n, sol[NMAX], curr[NMAX], noSol;

void back(int k) {
  if (k == n + 1) {
    noSol++;
    if (noSol == 1) {
      memcpy(sol, curr, sizeof(curr));
    }
    return ;
  }

  for (int i = 1; i <= n; i++)
    if (!markColumn[i] && !markFstDiag[k - i + NMAX] && !markSndDiag[k + i]) {
      curr[k] = i;
      markColumn[i] = markFstDiag[k - i + NMAX] = markSndDiag[k + i] = true;
      back(k + 1);
      markColumn[i] = markFstDiag[k - i + NMAX] = markSndDiag[k + i] = false;
    }
}

int main() {
  freopen("damesah.in", "r", stdin);
  //freopen("damesah.out", "w", stdout);

  scanf("%d", &n);
  back(1);
  
  for (int i = 1; i <= n; i++) {
    printf("%d", sol[i]);
    if (i < n) printf(" ");
  }
  printf("\n");
  printf("%d\n", noSol);
  return 0;
}