diff options
Diffstat (limited to '01_introductory_problems/chessboard_and_queens_1624.cpp')
| -rw-r--r-- | 01_introductory_problems/chessboard_and_queens_1624.cpp | 42 |
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 | |||
| 5 | void 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 | |||
| 10 | std::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 | |||
| 20 | long 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 | |||
| 33 | int 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 | } | ||
