——编码方法: 格雷码——
考古家,炼金师和游戏达人来到了布达拉宫,啊不,布拉卡达学院。考古家经过调查发现,这里的学者会在装备上镶嵌原石,镶嵌满特定的原石组合可以发生共鸣。
每个装备上有3个镶嵌孔,原石有10种,不是所有的组合都能发生共鸣。现在他们想通过一个一个试的方法遍历所有可能的共鸣,那么如何才能使更换原石的次数最小?
炼金师说,这其实是个数学问题。我们不妨先用0~9十个数给十种原石编号。显然,从{000}到{999}一共有一千种组合,每种变化组合我们都需要更换3块原石中的一到三块。假如每次都更换三块原石,我们得尝试三千次。假如我们能够不重复地遍历这一千种组合,且每次只更换一块原石,那么更换一千次原石够了,显然这时更换次数最小。
当然,直接按照0,1,2,3,4...每次加一的顺序是行不通的,因为在进位时需要更换多次原石。例如从{009}到{010}需要更换十位和个位两块原石,从{2,9,9}到{3,0,0}需要换三块。
但是,有一种数字编码可以满足“每次加一时只改变一位数字”,那就是(十进制版的)格雷码!(十进制的)格雷码是这样构造的,假如一个数字十进制表示为
abc,(即100a+10b十c),
那么首先将它右移一位并舍去个位,即
0ab,
然后两数每一位上的数字分别相减即得到格雷码:
a(b-a)(c-b),
例如129的格雷码是1(2-1)(9-2)为117,而130的格雷码是1(3-1)(0-3)为127。注意当出现0-3这种“不够减的情况,我们凭空借它一位变成10-3即可,或者说对-3关于10取余。
我们不妨检验一下,91到110的格雷码分别为
91~100: 92,93,94,95,96,97,98,99,90,190;
101~110: 191,192,193,194,195,196,197,198,199,189。
考古家,炼金师和游戏达人来到了布达拉宫,啊不,布拉卡达学院。考古家经过调查发现,这里的学者会在装备上镶嵌原石,镶嵌满特定的原石组合可以发生共鸣。
每个装备上有3个镶嵌孔,原石有10种,不是所有的组合都能发生共鸣。现在他们想通过一个一个试的方法遍历所有可能的共鸣,那么如何才能使更换原石的次数最小?
炼金师说,这其实是个数学问题。我们不妨先用0~9十个数给十种原石编号。显然,从{000}到{999}一共有一千种组合,每种变化组合我们都需要更换3块原石中的一到三块。假如每次都更换三块原石,我们得尝试三千次。假如我们能够不重复地遍历这一千种组合,且每次只更换一块原石,那么更换一千次原石够了,显然这时更换次数最小。
当然,直接按照0,1,2,3,4...每次加一的顺序是行不通的,因为在进位时需要更换多次原石。例如从{009}到{010}需要更换十位和个位两块原石,从{2,9,9}到{3,0,0}需要换三块。
但是,有一种数字编码可以满足“每次加一时只改变一位数字”,那就是(十进制版的)格雷码!(十进制的)格雷码是这样构造的,假如一个数字十进制表示为
abc,(即100a+10b十c),
那么首先将它右移一位并舍去个位,即
0ab,
然后两数每一位上的数字分别相减即得到格雷码:
a(b-a)(c-b),
例如129的格雷码是1(2-1)(9-2)为117,而130的格雷码是1(3-1)(0-3)为127。注意当出现0-3这种“不够减的情况,我们凭空借它一位变成10-3即可,或者说对-3关于10取余。
我们不妨检验一下,91到110的格雷码分别为
91~100: 92,93,94,95,96,97,98,99,90,190;
101~110: 191,192,193,194,195,196,197,198,199,189。