C++实现的灯泡开关 II


假设一个房间里有 n 盏初始状态为打开的灯,墙上安装了 4 个按钮。在对按钮进行了正好 m 次未知操作后,我们需要返回 n 盏灯有多少种不同的状态组合。假设 n 盏灯分别标记为 [1, 2, 3 ..., n],这 4 个按钮的功能如下:

  • 翻转所有灯。
  • 翻转偶数编号的灯。
  • 翻转奇数编号的灯。
  • 翻转 (3k + 1) 编号的灯,k = 0, 1, 2, ...

现在如果 n = 3 且 m = 1,那么将会有 4 种操作,它们分别是:[关,开,关],[开,关,开],[关,关,关],[关,开,开]

为了解决这个问题,我们将遵循以下步骤:

  • 如果 n 为 0 或 m 为 0,则返回 1
  • 如果 n 为 1,则返回 2
  • 如果 n 为 2,当 m 为 1 时返回 3,否则返回 4
  • 如果 m 为 1,则返回 4
  • 如果 m 为 2,则返回 7,否则返回 8。

让我们看下面的实现来更好地理解:

示例

在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int flipLights(int n, int m) {
      if (m == 0 || n == 0) return 1;
      if (n == 1) return 2;
      if (n == 2) return m == 1? 3:4;
      if (m == 1) return 4;
      return m == 2? 7:8;
   }
};
main(){
   Solution ob;
   cout << (ob.flipLights(3, 1));
}

输入

3
1

输出

4

更新于:2020年5月4日

229 次浏览

开启您的职业生涯

完成课程获得认证

开始
广告