描述
一个房间中有 n
盏灯最初是开着的,并且墙上有 4
个开关。在对开关进行 m
次未知的操作后,你需要返回这 n
盏灯有多少种不同的状态。
假设 n
盏灯的标号为 [1, 2, 3 ..., n]
, 4
个开关的功能如下:
1.将所有灯从开变成关,从关变成开。
2.将标号为偶数的灯从开变成关,从关变成开。
3.将标号为奇数的灯从开变成关,从关变成开。
4.将标号为 (3k + 1)
的灯从开变成关,从关变成开,k = 0, 1, 2...
样例
给出 n = 1, m = 1。
返回 2 // 状态可以是: [on], [off]
给出 n = 2, m = 1。
返回3 // 状态可以是: [on, off], [off, on], [off, off]
共有四种开关,分别标记为①②③④ ,将每次所按的开关用序号表示,可以用一个长度为m的序列表示开关打开次序,例如④③②③①表示共开5次开关,每次开启对应开关。
其实①②③之间有特殊的关系,开启②和③各一次,与直接开①一次效果相同。继而又发现,开启①和②各一次,与直接开③一次效果相同;开启①和③各一次,与直接开②一次效果相同,而且与开启顺序无关。那么上边的④③②③①可以简化为④(③②)(③①)=④①②=④③。
当只开启一次,即m = 1时,与n有关:
- n=1,会有两种结果,[on], [off]。
- n=2,因为此时③与④相同,3k+1只有1,会有三种结果。
- n>2,此时四种开关功能均不同,所以有四种结果。
当开启2次,第一次开启完有四种情况①,②,③,④。第二次有4*4=16中结果,但是其中有很多重复,对其进行化简。
使用s表示初始状态
(纵)第一次 | ① | ② | ③ | ④ |
---|---|---|---|---|
① | ①①=s | ①②=③ | ①③=② | ①④ |
② | ②①=③ | ②②=s | ②③=① | ②④ |
③ | ③①=② | ③②=① | ③③=s | ③④ |
④ | ④① | ④② | ④③ | ④④=s |
共有①,②,③,①④,②④,③④,s七种结果。
当开启超过3次时,会比开启2次多出一种结果,即④。
但是,这些都是基于第一次开启后会有4中不同结果的前提。如果n小于3,第一次开启后,结果数基于之前的分析小于4,此时结果数=2^n。