佛山市南海区桂城街道桂澜北路2号亿能国际广场2座511-B室(住所申报) 13706130838 jinnian@baidu.ag

新闻中心

开关谜题怎样让相邻状态只变化一位:十六种开关状态的单步变化(实例06)

2026-11-05

若菜单或谜题要求每次只翻动一个开关,直接按普通二进制计数并不总能满足条件。一种构造方式是把索引与它右移一位的结果异或,形成相邻仅一位不同的序列。

先确定规则与输入

本例使用四个开关,共十六种状态。先生成上述序列,再循环移动起点、交换位的位置,并异或一个固定掩码。三个变换都保留相邻状态只差一位的性质,末项到首项也要检查。

起始索引5,异或掩码0010 原第零到三位分别搬到位置[0, 2, 3, 1]

逐项算出过程

位置0对应原索引5,原序列四位0111,交换位次再加掩码后1111,十进制值15。

位置1对应原索引6,原序列四位0101,交换位次再加掩码后1011,十进制值11。

位置2对应原索引7,原序列四位0100,交换位次再加掩码后1010,十进制值10。

位置3对应原索引8,原序列四位1100,交换位次再加掩码后1000,十进制值8。

位置4对应原索引9,原序列四位1101,交换位次再加掩码后1001,十进制值9。

位置5对应原索引10,原序列四位1111,交换位次再加掩码后1101,十进制值13。

位置6对应原索引11,原序列四位1110,交换位次再加掩码后1100,十进制值12。

位置7对应原索引12,原序列四位1010,交换位次再加掩码后0100,十进制值4。

位置8对应原索引13,原序列四位1011,交换位次再加掩码后0101,十进制值5。

位置9对应原索引14,原序列四位1001,交换位次再加掩码后0001,十进制值1。

位置10对应原索引15,原序列四位1000,交换位次再加掩码后0000,十进制值0。

位置11对应原索引0,原序列四位0000,交换位次再加掩码后0010,十进制值2。

位置12对应原索引1,原序列四位0001,交换位次再加掩码后0011,十进制值3。

位置13对应原索引2,原序列四位0011,交换位次再加掩码后0111,十进制值7。

位置14对应原索引3,原序列四位0010,交换位次再加掩码后0110,十进制值6。

位置15对应原索引4,原序列四位0110,交换位次再加掩码后1110,十进制值14。

每一步变化的位位置为[2, 0, 1, 0, 2, 0, 3, 0, 2, 0, 1, 0, 2, 0, 3, 0],包含最后回到第一步。十六个状态恰好覆盖零至十五。位位置从右边最低位开始数零。

复核时看什么

逐项比较相邻状态的异或结果,应该恰好只有一个置位。同时检查十六种状态无重复,这样才是完整经过全部开关组合。反向解读时,要先撤销掩码与位交换,再还原原索引。

练习时可以先遮住结果,沿用相同输入独立记录中间状态,再逐项比较。发现不同后先定位最早分歧,确认边界包含方式、编号起点、更新顺序以及是否提前取整。最后结果一致也不表示每个中间步骤都正确,因此保留过程记录有助于看清原因。

适用范围

这个练习只给出开关组合的顺序,不保证任意关卡都能照此行走。若某些组合禁止进入,完整序列可能被截断。输入采样和实际开关动作也有各自的时序问题,不能只靠编码解决。