lintCode学习之路:电灯切换
来源:互联网 发布:overture打谱软件 编辑:程序博客网 时间:2024/04/29 23:37
电灯切换
一个房间中有 n 盏灯最初是开着的,并且墙上有 4 个开关。在对开关进行 m 次未知的操作后,你需要返回这 n 盏灯有多少种不同的状态。
假设 n 盏灯的标号为 [1, 2, 3 …, n], 4 个开关的功能如下:
1.将所有灯从开变成关,从关变成开。
2.将标号为偶数的灯从开变成关,从关变成开。
3.将标号为奇数的灯从开变成关,从关变成开。
4.将标号为 (3k + 1) 的灯从开变成关,从关变成开,k = 0, 1, 2…
解题思路:
这个题目一开始看确实有些看不大懂,按照题目要求第一反应就是程序去实现开关逻辑,但仔细一想实现起来非常困难。其实这个题目是一个很简单的分类讨论问题,按照题目要求可知灯泡的状态总共有以下几种
- 全亮
- 奇数亮
- 偶数亮
- 3k+1亮
- 奇数亮、3k+1亮
- 偶数亮、3k+1亮
- 奇数亮、偶数亮、3k+1不亮
- 全不亮
下面列出m、n所有的可能情况
以上结果有兴趣可以自行推断,代码就比较简单了,把分析的结果贴上去就行了,特别要注意n或m为0的情况
public int flipLights(int n, int m) { if(n==0){ return 0; } if(m==0){ return 1; } if(n==1){ return 2; } if(n==2){ if(m==1){ return 3; } return 4; } if(m==1){ return 4; } if(m==2){ return 7; } return 8;}
阅读全文