使用2 ^ n步骤来获得房间中每个人的可能组合

Jac*_*ale 1 algorithm backtracking data-structures

这是消费税:

你从一个空房间开始,一群n个人在外面等着.在每一步,您可以允许一个人进入房间,或者让一个人进入房间.你能安排一个2 n步骤的序列,这样每个可能的人组合都可以完成一次吗?


我的解决方案是:

我可以有一个有n个元素的位数组.每个元素的状态代表这个人是否在房间里.总而言之,我们将在房间里有2 不同的人组合.

该算法可以是标准回溯以列出所有组合.


我只是想知道我的想法是太天真还是简单?

这个消费税中的任何陷阱?


编辑:

对于对实施感兴趣的人gray code,请参阅

http://yagni.com/graycode/

aio*_*obe 12

该算法可以是标准回溯以列出所有组合.

你的解决方案"有效",但如果天真实施,它将需要超过2 n步.

请参阅问题陈述中的以下句子:

在每一步,您可以允许一个人进入房间,或者让一个人进入房间.

在你的解决方案中,当你列出所有的位向量时,你可能会0111跟着1000这意味着三个人将不得不离开房间,一个人将不得不进入.

这需要4个步骤,而不是一个步骤,因此您将获得超过2 步骤来运行所有组合.

但是,您可以排列您描述的位向量,使得两个连续向量之间只有一位不同.这就是格雷码.

以下是维基百科文章中的一个例子:

Dec  Gray   Binary
 0   000    000
 1   001    001
 2   011    010
 3   010    011
 4   110    100
 5   111    101
 6   101    110
 7   100    111
Run Code Online (Sandbox Code Playgroud)

注意如何

  1. 所有位向量都被覆盖,并且
  2. 对于每个连续的向量,只有一位改变.

这意味着您将能够以精确的2 n步骤迭代所有组合.

如何实现这样的序列生成器也在维基百科页面中解释,但如果这是一个练习,我建议你在偷看前自己尝试;)