aboutsummaryrefslogtreecommitdiff
path: root/01_introductory_problems/chessboard_and_queens_1624.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--01_introductory_problems/chessboard_and_queens_1624.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/01_introductory_problems/chessboard_and_queens_1624.cpp b/01_introductory_problems/chessboard_and_queens_1624.cpp
new file mode 100644
index 0000000..d595232
--- /dev/null
+++ b/01_introductory_problems/chessboard_and_queens_1624.cpp
@@ -0,0 +1,42 @@
1#include <bitset>
2#include <iostream>
3#include <string>
4
5void set_bit(std::bitset<64>& r, int i, int j) {
6 if (i >= 0 && i < 8 && j >= 0 && j < 8)
7 r |= 1ULL << (unsigned long long)(8*i + j);
8}
9
10std::bitset<64> maskall(const std::bitset<64>& b, int i, int j) {
11 std::bitset<64> r{b};
12 r |= 0x0101010101010101ULL << (unsigned long long)j;
13 for (int k = 0; k < 8; k++) {
14 set_bit(r, k, k+j-i);
15 set_bit(r, k, -k+j+i);
16 }
17 return r;
18}
19
20long long f(std::bitset<64>& b, int i) {
21 if (i == 8)
22 return 1;
23 long long s{0};
24 for (int j = 0; j < 8; j++) {
25 if (!b[8*i+j]) {
26 auto rr = maskall(b, i, j);
27 s += f(rr, i+1);
28 }
29 }
30 return s;
31}
32
33int main() {
34 std::bitset<64> b{0};
35 std::string s;
36 for (int i = 0; i < 8; i++) {
37 std::cin >> s;
38 for (int j = 0; j < 8; j++)
39 b[8*i+j] = s[j] == '*';
40 }
41 std::cout << f(b, 0) << "\n";
42}

Generated with cgit - Back to sebastiano.tronto.net