按一次开关会翻转几盏灯,按两次又回到原状。只关心最终亮灭时,每个开关按偶数次相当于不按,按奇数次相当于按一次,这让搜索范围变得有限。
固定规则与输入
棋盘三乘三,按一格会翻转它自己以及地图内上下左右相邻格。亮为一、灭为零,目标全部熄灭。只记录每个位置是否按一次,共九个二进制选择。
格子按行编号零至八,初始棋盘 001 101 010 灯0初值0:受开关[0, 1, 3]影响,这些按动次数之和的奇偶应等于初值。 灯1初值0:受开关[0, 1, 2, 4]影响,这些按动次数之和的奇偶应等于初值。 灯2初值1:受开关[1, 2, 5]影响,这些按动次数之和的奇偶应等于初值。 灯3初值1:受开关[0, 3, 4, 6]影响,这些按动次数之和的奇偶应等于初值。 灯4初值0:受开关[1, 3, 4, 5, 7]影响,这些按动次数之和的奇偶应等于初值。 灯5初值1:受开关[2, 4, 5, 8]影响,这些按动次数之和的奇偶应等于初值。 灯6初值0:受开关[3, 6, 7]影响,这些按动次数之和的奇偶应等于初值。 灯7初值1:受开关[4, 6, 7, 8]影响,这些按动次数之和的奇偶应等于初值。 灯8初值0:受开关[5, 7, 8]影响,这些按动次数之和的奇偶应等于初值。
逐步观察结果
按位置0,翻转位置[0, 1, 3],剩余亮灯位置[0, 1, 2, 5, 7]。
按位置1,翻转位置[0, 1, 2, 4],剩余亮灯位置[4, 5, 7]。
按位置2,翻转位置[1, 2, 5],剩余亮灯位置[1, 2, 4, 7]。
按位置4,翻转位置[1, 3, 4, 5, 7],剩余亮灯位置[2, 3, 5]。
按位置5,翻转位置[2, 4, 5, 8],剩余亮灯位置[3, 4, 8]。
按位置6,翻转位置[3, 6, 7],剩余亮灯位置[4, 6, 7, 8]。
按位置7,翻转位置[4, 6, 7, 8],剩余亮灯位置[]。
全部选择中有1个解,最少按7次,选定位置[0, 1, 2, 4, 5, 6, 7],最终棋盘为零。重复按同一开关两次只增加动作次数,不改变最终亮灭。
独立复核
不同开关的翻转可以逐位异或合并,按下顺序不影响终态。可以枚举全部五百一十二种选择,也可以把每盏灯对应的奇偶条件写成方程,采用消元独立复核。
复核时先保留本例输入,再自己写出中间状态。若结果不同,应从最早出现差异的位置检查,尤其留意边界是否包含、索引从哪里开始、取整何时发生,以及是否使用了尚未更新的旧状态。计算得到的结论仅适用于已经说明的规则,修改规则后需要重新验证。
适用范围
本例只讨论规则固定的翻灯棋盘。若开关会变色、移动或改变其他开关规则,就不能继续把动作简单合并成奇偶性。最后还应把求出的步骤实际代入初始棋盘验证。
