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


Problem

1 /7


给定长度的二进制字符串

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

<分区> <分区>

给定数字 N 打印所有长度为 N 的字符串,按字典顺序由 0 和 1 组成。

在解决问题时,使用所有子模式的枚举

<分区>
输入

给定单数N。(自然,1 ≤ N ≤ 10)

<分区>
输出

需要按字典顺序打印所有长度为N的由0和1组成的字符串,每行一个

<分区> <分区> <分区> <正文>
 
输入 输出
<前> 2 <前> 00 01 10 11