AtCoder Beginner Contest 173 C問題

C問題

難易度:茶色

一発クリアです!

H行W列のマスに対して、
h行目もしくはw列目のマスを選択し、赤に塗りつぶす。

最終的に黒色のマスとして残った合計がKである選択する行・列のパターンを出力します。

解き方はHとWが6以下であるため、総当たりでいけるか
と思い、総当たり探索で解きました。

まず行と列の数を数え、
考えうる選択行・選択列の組み合わせをitertoolsで列挙します。

1行目だけ
1行目と1列目
1行目と1列目と2列目
・・・といった風に。
そしてこの選択行列の組み合わせパターンを配列にまとめます。

黒色:#、白色:・と定義していましたが
黒色:1、白or赤色:0に変換。
数値に変換した方が後々楽なので、Numpy配列に変換。

二次元配列をスライスして、
各行・列を選択し、赤(0)に塗りつぶします。

最終的に黒色(1)の数を知りたいので、
配列全体の合計値がそのまま黒色のマスの合計になりました!

import numpy as np
import itertools
H,W,K = map(int,input().split())
all_,choice = [],[]

lis = ['h'+str(h) for h in range(H)]
w_lis = ['w'+str(w) for w in range(W)]
lis.extend(w_lis)

for j in range(0,len(lis)+1):
  choice.extend(list(itertools.combinations(lis,j)))

for h in range(H):
  l = list(input().replace('#','1').replace('.','0'))
  all_.append(l)

all_ = np.array(all_,dtype=int)
ans = 0

for i in choice:
  A = all_.copy()
  for k in i:
    if k==None:
      pass
    elif k[0]=='h':
      A[int(k[1]),:]=0
    elif k[0]=='w':
      A[:,int(k[1])]=0
  #print(A)
  if A.sum()==int(K):
    ans+=1
      
print(ans)