見出し画像

ABC173 C問題(bit全探索)

要約

白と黒で埋められた表をどれかの列,行を赤で塗りつぶした時に残る黒色のマスがK個になるパターンを求める問題.

最初は手につかなかったが,途中で各列,各行を塗るor塗らないの2通りの全探索になることが分かった..

つまり,全部でH行,W列を塗るか塗らないかの最大2^(H+W)通り全探索すればよく,H+Wは最大で12なので余裕で間に合う.

このことからbit全探索を行えば良いことが分かる.

以前この記事でbit全探索の問題について扱ったため,これと同じ方針で解いていく.

意識する点としては,

・各列,各行でbit全探索をしていくこと.

・わざわざ表を塗り替える必要はなく,各要素ずつ見ていけば良いこと

の2点である.実装に関してはコードにコメントを記入したのでそちらを参考にしてほしい

H, W, K = map(int, input().split())
A = [list(input())for l in range(H)]

ans = 0
from itertools import product
#Trueが塗られないとする
for h_bit in product((True, False) , repeat = H):
 for w_bit in product((True, False), repeat = W):
   cnt = 0
   #----1つ1つの要素を見てくループ--
   for h in range(H):
     for w in range(W):
       #注目する要素が#でなおかつその行,列が塗られなければ良い
       if A[h][w] == "#" and (h_bit[h] and w_bit[w]):
         cnt += 1
   
   if cnt == K:
     ans += 1
print(ans)
       
    
 

この記事が気に入ったらサポートをしてみませんか?