【题目描述】
我们有一个 H 行 W 列的矩阵方格(1≤H,W≤6),行号是从上往下编号,列号是从左往右 编号。 第 i 行第 j 列位置小方格的颜色用字符 Ci,j给出(1≤i≤H;1≤j≤W;Ci,j 为’.’或’#’):
⚫ 如果 Ci,j为字符 ’.’,则该小方格为白色;
⚫ 如果 Ci,j为字符 ’#’,则该小方格为黑色;
考虑执行以下操作: •选择多行(也可能不选行)和多列(也可能不选列),然后将所选行中的所有格子和所 选列中的所有格子都涂成红色。 给你一个正整数 K(1≤K≤H×W),问你有多少次不同的选择,会导致每个选择的操作 结果都只剩下 K 个黑色方格?
本题看似数据范围很小,但是用暴力来做不仅可能超时,而且无从下手。所以转换思路,从另一方面求解。其实对于每一行,每一列,都只有刷或者不刷两种情况。所以很容易联想到利用二进制进行表示每一次选择的情况,行的粉刷情况和列的粉刷情况用两个数字表示(好吧这其实很难想到),所以每个二进制数都有唯一的十进制数与之一一对应;而用二进制表示情况转换为十进制再进行循环就大大减少的复杂度了
这其实就是状态压缩的思想
对于二进制,对于位运算也是解题的关键
附上AC代码
#include<bits/stdc++.h>
using namespace std;
int sum,ans,cnt;
char a[