cses

My solution for the coding challenges of cses.fi
git clone https://git.tronto.net/cses
Download | Log | Files | Refs | README

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 }