JosepRivaille

P16415: Reines (1)

May 17th, 2016
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef int boolean;
  5.  
  6.  
  7. class NReines {
  8.  
  9. private:
  10.   int n; //#Queens and square size
  11.   int count; //Possible ways
  12.   vector<int> current_config;
  13.   vector<boolean> column_marker;
  14.   vector<boolean> l_diagonal_marker;
  15.   vector<boolean> r_diagonal_marker;
  16.  
  17.   inline int diag1(int i, int j)
  18.   {
  19.     return n-j-1 + i;
  20.   }
  21.  
  22.   inline int diag2(int i, int j)
  23.   {
  24.     return i + j;
  25.   }
  26.  
  27.   void backtracking(int i) {
  28.     if (i == n) {
  29.       ++count;
  30.     }
  31.     else {
  32.       for (int j = 0; j < n; ++j) {
  33.     if (!column_marker[j] && !l_diagonal_marker[diag1(i, j)] && !r_diagonal_marker[diag2(i, j)]) {
  34.       current_config[i] = j;
  35.       column_marker[j] = l_diagonal_marker[diag1(i, j)] = r_diagonal_marker[diag2(i, j)] = true;
  36.       backtracking(i+1);
  37.       column_marker[j] = l_diagonal_marker[diag1(i, j)] = r_diagonal_marker[diag2(i, j)] = false;
  38.     }
  39.       }
  40.     }
  41.   }
  42.  
  43. public:
  44.  
  45.   NReines(int n) {
  46.    this->n = n;
  47.    count = 0;
  48.    current_config = vector<int>(n);
  49.    column_marker = vector<boolean>(n, false);
  50.    l_diagonal_marker = vector<boolean>(2*n - 1, false);
  51.    r_diagonal_marker = vector<boolean>(2*n - 1, false);
  52.    backtracking(0);
  53.    cout << count << endl;
  54.   }
  55.  
  56. };
  57.  
  58. int main()
  59. {
  60.   int n;
  61.   cin >> n;
  62.   NReines N(n);
  63. }
  64.  
  65. //JosepRivaille
Add Comment
Please, Sign In to add comment