主题:请教各位同仁一个问题
波利克思
[专家分:0] 发布于 2007-10-03 23:40:00
将2^n个0和2^n个1排成一圈,从任意一个位置开始,每次按逆时针的方向以长度为n+1的单位计数二进制数。要求给出一种排法,用上面的方法产生出2^n+1个不相同的二进制数。(我不理解吴再陵版的pascal中的描述),请各位给我讲一讲。
回复列表 (共4个回复)
沙发
Matodied [专家分:7560] 发布于 2007-10-04 11:07:00
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……
板凳
波利克思 [专家分:0] 发布于 2007-10-04 11:44:00
什么意思呀
3 楼
Matodied [专家分:7560] 发布于 2007-10-04 21:42:00
我不是把规律和你说了吗?
刚开始是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 楼
波利克思 [专家分:0] 发布于 2007-10-08 22:28:00
太感谢你了,呵呵,你这水平绝对是金牌教练,我用你的方法通过了。
我来回复