H and V
問題
C – H and V
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2021/1/17 解法なんとなく、実装できず。
解法
bit全探索
で行を選択するパターン(\(2^6\))と列を選択するパターン(\(2^6\))を用意しておく。- 行を選択するパターンと行を選択するパターンを全パターン試す(\(2^{12} = 4096\))
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; vector<vector<int>> createBits(int a) { vector<vector<int>> res; vector<int> v; res.push_back(v); for(int bit = 1; bit < (1 << a); ++bit) { vector<int> v; for(int i = 0; i < a; ++i) { if(bit >> i & 1) { v.push_back(i); } } res.push_back(v); } return res; } int main() { int H, W, K; cin >> H >> W >> K; int all = 0; vector<string> maze(H); rep(i, H) { cin >> maze[i]; rep(j, W) { if(maze[i][j] == '#') { all++; } } } int ans = 0; vector<vector<int>> bitsH = createBits(H); vector<vector<int>> bitsW = createBits(W); int h = bitsH.size(); int w = bitsW.size(); rep(i, (int)bitsH.size()) { vector<int> checkH(H); rep(j, (int)bitsH[i].size()) { int h = bitsH[i][j]; checkH[h] = 1; } rep(k, (int)bitsW.size()) { vector<int> checkW(W); rep(l, (int)bitsW[k].size()) { int w = bitsW[k][l]; checkW[w] = 1; } int cnt = 0; rep(i2, H) { rep(j2, W) { if(maze[i2][j2] == '#') { if(checkH[i2] == 1 || checkW[j2]) { cnt++; } } } } if(all - cnt == K) { ans++; } } } cout << ans << endl; return 0; }