回 帖 发 新 帖 刷新版面

主题:请教各位同仁一个问题

将2^n个0和2^n个1排成一圈,从任意一个位置开始,每次按逆时针的方向以长度为n+1的单位计数二进制数。要求给出一种排法,用上面的方法产生出2^n+1个不相同的二进制数。(我不理解吴再陵版的pascal中的描述),请各位给我讲一讲。

回复列表 (共4个回复)

沙发

                           0
                         0   1
                       0       0
                     0           0
                   0               1
                 1                   0                  
               1                       1
             1                           0                      
           1                               0 
             1                           0
               0                       1
                 1                   1
                   0               1
                     1           0
                       1       1
                         0   1
                           0
这是N=4时的一个可能的排法。可以看出一开始(从顶上的那个0开始)是N+1个0,再是N+1个1,然后一个0,然后1个1和1个0、2个1和2个0、3个1和3个0……

板凳

什么意思呀

3 楼

我不是把规律和你说了吗?

刚开始是N+1个0,N+1个1,然后是一个0,然后是1个1和1个0、2个1和2个0……

或者你直接回朔。
定义一个数组a[0..2 ^ (n + 1) - 1] OF BOOLEAN,(刚开始a数组的每一个元素都是TRUE)然后写上n + 1个0,n + 1个1,将2 ^ 0 - 1、2 ^ 1 - 1…2 ^ (n + 1) - 1全部置为FALSE。接着你一位一位地放。

第i位有放0和放1两种可能,然后检查:
将从第i - n位到第i位的n + 1个数组成的二进制数转换为十进制数s。
此时如果下面两点符合,我们就认为这位可以放t(t等于0或1)。
(1)a[s] = TRUE
(2)t没有被用完(即从第1位到第i位之间的t的个数小于等于2^n)
当然,如果该位放0和1都不行的时候就得回朔了。
不过放到最后一位的时候,还要检查额外组成的n个数(即最后几位和开始几位连在一起的那些数)是否符合(1)(2)条件。

4 楼

太感谢你了,呵呵,你这水平绝对是金牌教练,我用你的方法通过了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册