TAOCP V4.F2 格雷码(2)
九链环问题(Chinese ring puzzle)。
1、预备知识,关于异或
若F=a0a1...an-2an-1,那么,若发生aj=1-aj (0<=j<n) 这样的变化,则 F=1-F。
2、知识浏览
1、为什么类型(b)的移动,将k变成k(2j+1-1)?
设环的状态为(an-1an-2...a1a0)2,且g-1( (an-1an-2...a1a0)2 )=(bn-1bn-2...b1b0)2=k。
若ai=0 (i<j),且aj=1。那么,经过类型(b)的移动,an-1an-2...a1a0变成:
an-1an-2...!aj+1...a1a0 ( !aj+1为aj+1取补 )
于是,由反转公式:bj=ajaj+1...an-2an-1 知道,bj+1...b1b0 的所
有位均取补了。
所以说:类型(b)的移动,将k变成k(2j+1-1)。
2、若g-1( (an-1an-2...a1a0)2 )=(bn-1bn-2...b1b0)2=k,为什么最少k步且只要k步,就
可以解决九链环问题?
我们只要证明:类型(a)、(b)的移动每次能且只能将k减少1。
首先,(a)类移动与(b)类移动是互斥的:每次只有一种移动是朝目标而去的,另一
种移动是倒退,不可取。
当k为奇数时,(a)类移动使k减少1。
当k为偶数时,(b)类移动使k变成k(2j+1-1)。
k(2j+1-1)最多可以将k减少多少?
实际上,j+1等于k中含2的幂的最高次数,也就是等于k的二进制“直尺函数”。
因此,k(2j+1-1)最多可以将k减少1。
二进制格雷码生成算法: