Advertisement
CyberN00b

queens(all solutions)(map NxN with N queens)

Jun 1st, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define spc << ' ' <<
  3. #define spce << ' '
  4. #define ele << '\n'
  5. #define el << '\n' <<
  6. #define cout cout <<
  7. #define INF 99999
  8. #define AINF -99999
  9. #define ULINT unsigned long long int
  10. #define LINT long long int
  11. using namespace std;
  12. template<typename tmp>
  13. void output(vector<tmp>& vc, char en = ' ') {
  14.     for (tmp x : vc)
  15.         cout x << en;
  16. }
  17. template<typename tmp>
  18. void input(vector<tmp>& vc) {
  19.     for (tmp& x : vc)
  20.         cin >> x;
  21. }
  22.  
  23. bool cmax(int&, int);
  24. bool cmin(int&, int);
  25. int bit_degree(int, int);
  26. int nod(int, int);
  27. int c = 0;
  28. int l = 8;
  29. vector<pair<int, int> > taken;
  30. set<vector<pair<int, int> > > s;
  31. char* mt;
  32. char* mp(int x, int y) {
  33.     return &mt[x + y * l];
  34. }
  35. void paint_up(int x, int y) {
  36.     taken.push_back({x, y});
  37.     *mp(x, y) += 1;
  38.     for (int i = 0; i < x; ++i)
  39.         *mp(i, y) += 1;
  40.     for (int i = x + 1; i < l; ++i)
  41.         *mp(i, y) += 1;
  42.     for (int i = 0; i < y; ++i)
  43.         *mp(x, i) += 1;
  44.     for (int i = y + 1; i < l; ++i)
  45.         *mp(x, i) += 1;
  46.     for (int i = 1; y - i >= 0 && x - i >= 0; ++i)
  47.         *mp(x - i, y - i) += 1;
  48.     for (int i = 1; y + i < l && x + i < l; ++i)
  49.         *mp(x + i, y + i) += 1;
  50.     for (int i = 1; y - i >= 0 && x + i < l; ++i)
  51.         *mp(x + i, y - i) += 1;
  52.     for (int i = 1; y + i < l && x - i >= 0; ++i)
  53.         *mp(x - i, y + i) += 1;
  54. }
  55. void remove_paint() {
  56.     int x, y;
  57.     x = (*(taken.end() - 1)).first;
  58.     y = (*(taken.end() - 1)).second;
  59.     *mp(x, y)-= 1;
  60.     for (int i = 0; i < x; ++i)
  61.         *mp(i, y) -= 1;
  62.     for (int i = x + 1; i < l; ++i)
  63.         *mp(i, y) -= 1;
  64.     for (int i = 0; i < y; ++i)
  65.         *mp(x, i) -= 1;
  66.     for (int i = y + 1; i < l; ++i)
  67.         *mp(x, i) -= 1;
  68.     for (int i = 1; y - i >= 0 && x - i >= 0; ++i)
  69.         *mp(x - i, y - i) -= 1;
  70.     for (int i = 1; y + i < l && x + i < l; ++i)
  71.         *mp(x + i, y + i) -= 1;
  72.     for (int i = 1; y - i >= 0 && x + i < l; ++i)
  73.         *mp(x + i, y - i) -= 1;
  74.     for (int i = 1; y + i < l && x - i >= 0; ++i)
  75.         *mp(x - i, y + i) -= 1;
  76.     taken.pop_back();
  77. }
  78. bool take_next(int num = 8) {
  79.     if (num == 0) {
  80.         sort(taken.begin(), taken.end());
  81.         s.insert(taken);
  82.         return true;
  83.     }
  84.     auto t = find(mt, mt + l * l, 0);
  85.     while (t != mt + l * l) {
  86.         int tmp = t - mt;
  87.         paint_up(tmp % l, tmp / l);
  88.         bool tb = take_next(num - 1);
  89.         if (tb && num != l) {
  90.             remove_paint();
  91.             return tb;
  92.         } else {
  93.             remove_paint();
  94.             t = find(t + 1, mt + l * l, 0);
  95.         }
  96.     }
  97.     return false;
  98. }
  99. int main() {
  100.     cin >> l;
  101.     mt = new char[l * l];
  102.     for (int i = 0; i < l * l; ++i)
  103.         mt[i] = 0;
  104.     take_next(l);
  105.     int c = 0;
  106.     if (s.size())
  107.         for_each(s.begin(), s.end(), [&c](vector<pair<int, int> > ta){cout ++c << ':' ele; for (auto x : ta) cout char(int('a') + x.first) << x.second + 1 spce; cout '\n'; });
  108.     else
  109.         cout "No answer";
  110. }
  111.  
  112. int nod(int a, int b) {
  113.     return b ? nod(b, a % b) : a;
  114. }
  115.  
  116. bool cmax(int& a, int b) {
  117.     if (a >= b)
  118.         return false;
  119.     else {
  120.         a = b;
  121.         return true;
  122.     }
  123. }
  124.  
  125. bool cmin(int& a, int b) {
  126.     if (a <= b)
  127.         return false;
  128.     else {
  129.         a = b;
  130.         return true;
  131.     }
  132. }
  133.  
  134. int bit_degree(int a, int b) {
  135.     if (b != 1)
  136.         if (!(b % 2)) {
  137.             b /= 2;
  138.             int tmp = bit_degree(a, b);
  139.             return tmp * tmp;
  140.         } else {
  141.             b--;
  142.             return (bit_degree(a, b) * a);
  143.         }
  144.     else
  145.         return a;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement