解法一

所有灯泡的状态都和前四个灯泡有关,同一种操作重复两次也没有意义。由此可以大大缩小数据范围。注意考虑边界情况。

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. class Solution {
  4. Set<Integer> ans;
  5. public int flipLights(int n, int m) {
  6. // 其他灯泡的状态都可以通过前4个灯泡的状态导出
  7. n = Math.min(4, n);
  8. // 有效操作最多4次, 每种1次
  9. m = Math.min(4, m);
  10. switch (n) {
  11. case 0:
  12. return 0;
  13. case 1:
  14. if (m == 0) {
  15. return 1;
  16. } else {
  17. return 2;
  18. }
  19. case 2:
  20. if (m == 0) {
  21. return 1;
  22. } else if(m==1){
  23. return 3;
  24. }else {
  25. return 4;
  26. }
  27. case 3:
  28. switch (m) {
  29. case 0:
  30. return 1;
  31. case 1:
  32. return 4;
  33. case 2:
  34. return 7;
  35. default:
  36. return 8;
  37. }
  38. }
  39. ans = new HashSet<>();
  40. bfs(m, 0b0000);
  41. return ans.size();
  42. }
  43. private void bfs(int m, int status) {
  44. if (m == 0) {
  45. ans.add(status);
  46. return;
  47. }
  48. bfs(m - 1, 0b1111 ^ status);
  49. bfs(m - 1, 0b0101 ^ status);
  50. bfs(m - 1, 0b1010 ^ status);
  51. bfs(m - 1, 0b1001 ^ status);
  52. }
  53. }