Bulb Switcher II 灯泡开关 Ⅱ

转载博客:https://blog.csdn.net/huanghanqian/article/details/77857912

现有一个房间,墙上挂有 n 只已经打开的灯泡和 4 个按钮。在进行了 m 次未知操作后,你需要返回这 n 只灯泡可能有多少种不同的状态。

假设这 n 只灯泡被编号为 [1, 2, 3 ..., n],这 4 个按钮的功能如下:

  1. 将所有灯泡的状态反转(即开变为关,关变为开)
  2. 将编号为偶数的灯泡的状态反转
  3. 将编号为奇数的灯泡的状态反转
  4. 将编号为 3k+1 的灯泡的状态反转(k = 0, 1, 2, ...)

示例 1:

输入: n = 1, m = 1.
输出: 2
说明: 状态为: [开], [关]

示例 2:

输入: n = 2, m = 1.
输出: 3
说明: 状态为: [开, 关], [关, 开], [关, 关]

示例 3:

输入: n = 3, m = 1.
输出: 4
说明: 状态为: [关, 开, 关], [开, 关, 开], [关, 关, 关], [关, 开, 开].

注意: n 和 m 都属于 [0, 1000].

思路:

如果我们使用了 button 1 和 2, 其效果等同于使用 button 3 。
类似的..

1 + 2 --> 3, 1 + 3 --> 2, 2 + 3 --> 1
所以,只有 8 种情形。

All_on, 1, 2, 3, 4, 1+4, 2+4, 3+4

并且当 n>2 and m>=3 时,我们就能够获得所有的情形。

以下是另外一种解释的方法:

这 4 个按钮代表了 4 种数字。
x % 2 == 1 && x % 3 == 1, such as x == 1;
x % 2 == 1 && x % 3 != 1, such as x == 3;
x % 2 == 0 && x % 3 == 1, such as x == 4;
x % 2 == 0 && x % 3 != 1, such as x == 2.

因此有 8 种独立的按钮操作(假设原来的状态是 on, on, on, on) : 
1                                               (off, off, off, off)
2                                               (on, off, on, off)
3                                               (off, on, off, on)
4                                               (off, on, on, off)
1 + 4                                         (on, off, off, on)
2 + 4                                         (off, off, on, on)
3 + 4                                         (on, on, off, off)
1 + 2 + 3 == 3 + 3                    (on, on, on, on)
因为 1 + 2 == 3, 2 + 3 == 1, 1 + 3 == 2, 1 + 2 + 4 == 3 + 4, 2 + 3 + 4 == 1 + 4,1 + 3 + 4 == 2 + 4, 1 + 2 + 3 + 4 == 3 + 3 + 4 == 4。

当 m == 0 时, 无事发生,只有 1 种状态。

当 n == 1 时, bulb 可以为 "on" 状态(使用按钮 2 来按动偶数开关,不会造成任何变化 )。也可以为 "off" 状态(使用了按钮 1 or 3 or 4 )。
操作 2 = 操作 1+操作 3 。操作 3 = 操作 1 + 操作 2 。操作 1 = 操作 2 + 操作 3 。因此,对于奇数次操作还是偶数次操作,我们都可以得到相同的状态。 当 n == 1 时,结果始终为 2 ,始终能得到 2 个状态。

当 n == 2 时, 有 4 种可能的状态。"on, off" == 2 ==1 + 3 。   "off, on" == 3 == 1 + 2。    "off, off" == 1 == 2 + 3。    "on, on" == 1 + 1 == 2 + 3 + 1 == 1 + 3 + 3 + 1 ==  2 + 2 == 3 + 3 == 4 + 4 。除了状态 "on, on" 需要 2 次或者 2 次以上的操作,其他状态都可以通过任意奇数/偶数操作来得到。

当 n == 3 时, 8 种 不同的状态都有可能发生。使用跟上面同样的分析方法,我们可以发现除了 m == 1 and m == 2 的情形, 其他的情形都能够得到 8 种状态。
--------------------- 
参考代码:

class Solution {
public:
    int flipLights(int n, int m) {
        if (m == 0) return 1;
        if (n == 1) return 2;
        if (n == 2 && m == 1) return 3;
        if (n == 2) return 4;
        if (m == 1) return 4;
        if (m == 2) return 7;
        return 8;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/83317618