chessboard_and_queens_1624.cpp (834B)
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 }