Module: 遍历给定掩码的所有子模式


Problem

5 /7


埃里克和 LED 板

Theory Click to read/hide

正好需要枚举一定长度的所有位序列。或者换句话说,遍历所有可能的选项,其中为每个对象选择两种可能状态中的一种。

在这种情况下,可以使用位掩码实现枚举。这种方式的好处是这样的代码是非递归工作的,并且对数字而不是集合等进行操作,从而大大提高了性能。

下面给出了使用位掩码的一般代码: 国际; // oobjects 的数量(位序列的长度) for (int mask = 0; mask < (1 << n); mask++) { // 遍历从 0 到 2^n - 1 的所有数字,其中每个数字对应一个位掩码 // 当前数字掩码是位掩码,其中第i位指定第i个对象的状态 for (int i = 0; i < n; i++) { // 遍历 n 位以了解每个对象的状态 if ((1 << i) & mask) { // 检查第 i 位是否等于 1 // 处理第 i 个对象的状态为“1”的选项 } else { // 当第 i 位为零时的情况 // 处理状态为‘0’的第 i 个对象的选项 } } }
此代码在 O(2^n * f(n)) 中运行,其中 f(n) 是您处理一个特定可迭代对象所花费的时间。

Problem

埃里克在他祖父的旧车库里找到了一块 LED 板。然而,令他惊讶的是,当激活时,二极管彼此并不同步。也就是有的烧了,有的没烧。
董事会本身被证明是不寻常的。它是一个 n 行 m 列的矩形网格,其中每个单元包含一个二极管。在每一行附近都有一个杠杆可以切换该行中的所有二极管(燃烧的二极管熄灭,反之亦然)。每列都有相同的杠杆(我使用相应列中的二极管)。
Eric 想知道是否可以通过切换杠杆将二极管切换到相同的状态。

输入:
第一行包含两个自然数 n 和 m (1 <= n, m <= 7) - 分别是棋盘上的行数和列数。
然后有 n 行,每行有 m 个数字 - 二极管的状态,其中 0 表示二极管关闭,1 表示二极管打开。

输出:
如果可以使二极管进入一种状态,则打印“是”,如果不可能,则打印“否”。

示例:
  <正文>
解释:
在第一个示例中,您可以切换第一行中的所有二极管,然后切换第一列中的所有二极管。然后所有二极管都将关闭。
 
输入 输出
2 2
0 1
10
2 2
0 1
0 0
没有