六个不同图标的排列怎样变成可还原的编号:独立演算第07例
关卡中六个不同图标有许多排列。若想给每种排列一个连续且可还原的编号,可以按字母顺序比较排列,并记录每一步跳过了多少个较小的可用图标。
图标为A至F,每个恰好出现一次,编号从零开始。第一个位置的贡献是它在剩余有序图标中的下标乘五的阶乘,后续依次乘四、三、二、一、零的阶乘;把所有贡献相加。
这一例的完整输入
八个独立编号为[708, 656, 225, 556, 172, 388, 113, 4];A小于B,依此到F。
逐项计算记录
编号 | 还原排列 | 六个剩余列表下标 | 六项贡献 708 | FECABD | [5, 4, 2, 0, 0, 0] | [600, 96, 12, 0, 0, 0] 656 | FCBDAE | [5, 2, 1, 1, 0, 0] | [600, 48, 6, 2, 0, 0] 225 | BFCDEA | [1, 4, 1, 1, 1, 0] | [120, 96, 6, 2, 1, 0] 556 | EDAFBC | [4, 3, 0, 2, 0, 0] | [480, 72, 0, 4, 0, 0] 172 | BDAFCE | [1, 2, 0, 2, 0, 0] | [120, 48, 0, 4, 0, 0] 388 | DBAFCE | [3, 1, 0, 2, 0, 0] | [360, 24, 0, 4, 0, 0] 113 | AFDECB | [0, 4, 2, 2, 1, 0] | [0, 96, 12, 4, 1, 0] 4 | ABCFDE | [0, 0, 0, 2, 0, 0] | [0, 0, 0, 4, 0, 0]
读表时先把输入与计算后的结果分开。空值表示这一步没有适用对象或没有可用结果,不应自动换成零。编号只负责识别本例中的元素,同一个数字出现在不同字段时,要先确认它代表位置、对象还是数值。
怎样复核和使用
还原时把编号按相应阶乘依次除出下标,从剩余列表取走该图标,余数继续向后处理。六位排列共有720种,合法编号为零至719,解码后的图标不能重复。
此方法依赖元素全部不同,不能直接拿来给包含重复图标的队列编号。它也是一种确定的排序编号,并不自动生成均匀随机排列;想随机抽取还要单独说明抽样规则。
可以先遮住记录表,只按上述规则重算前两步,再选择一个边界条件重新试算。若结果不一致,应逐项检查输入顺序、端点是否包含以及状态在哪一步更新;不要只看最终合计相同就认为中间处理也完全正确。
