假设我有几个N位数,其中K(1 示例:N = 3,K = 1(中间位固定为“0”)。那么可能的排列是 假设我的数字 X = 000且数组 fixed = { - 1,0,-1}存储固定位信息(-1 =不是固定,0或1 =固定)。
简单的解决方案是生成所有排列
000
001
100
101
000,001,...,111
并逐位遍历每一个并测试所有固定位是否具有正确的值(存储在 fixed 中)。如果至少有一个固定位与 fixed 中的对应值不同,则从结果中删除此排列。
答案 0 :(得分:0)
你使这个问题比现在更困难。
如果你看一下你的例子
000
001
100
101
这真的只是
00
01
10
11
其中固定零的第二个字段已被删除。
所以问题不是生成所有解决方案然后删除一些行,问题是只为变量字段生成解决方案然后插入固定字段。
答案 1 :(得分:0)
简单的比特技巧可以有效地解决这个问题。
制作二元面具:
A ,其中清除所有固定位(固定零和固定的!)并设置其他位
B ,其中设置了固定的
例如,x01x
提供A = 1001, B = 0010
遍历A
的所有子掩码,并在输出前设置B
的固定子掩码:
sm = A
repeat:
out = sm or B
//use out bit combination
sm = (sm - 1) & A
until (sm = 0)
此方法生成所有需要的位组合而无需过多的步骤