您的位置:首页 > 其它

LeetCode - NimGame

2016-02-14 22:43 363 查看
开始刷算法题了,尽量一天一道。



一、分析

拿到一道题目,首先我们要冷静分析,千万不要一上来就直接搞代码,那样纯粹是浪费时间。偏偏这是我这种初级程序员最喜欢干的。

这个题最初的意思是:

两个人拿石头,每一次只能拿1~3块石头,“我”先拿,最后拿的人胜利,且我和对手都是聪明且想赢的。


翻译成中文之后我们需要抽象这道题的意思,把它再翻译成数学语言。

两个人拿石头
,其实就是
对一个数字做减法


我先拿
,其实就是
设定一个初始条件


最后拿的人胜利
,其实就是
判断拆分成奇数个还是偶数个


都是聪明且都想赢
,其实就是
尽可能的少拆分


最后我们得到的题意是:

将一个数字拆分成由1~3组合的数字,判断拆分的个数。


二、然后就先举例子去试探规律

1=>true
2=>true
3=>true
4=>false
5=>true
6=>true
7=>true
8=>false
.
.
.


验证4=>false

4=1+3 失败
4=2+2 失败
4=3+1 失败


验证5=>true

5=1+4 由于4是自己输,所以5一定是自己赢。
5=2+3 失败
5=3+2 失败

由于两个人都是聪明且想赢的,所以“我”一定会选择5=1+4从而获得胜利


验证6,7,8

6=1+5
6=2+4
6=3+3
由于4是必输,所以6可以通过6=2+4,转换成4,所以一定会胜利。

7=1+6
7=2+5
7=3+4

在这里我们就发现了,只要能转化成4的就可以获得胜利。因为4是原必输态,也就是现在的必胜态。

8=1+7
8=2+6
8=3+5
由于5,6,7都是必输的。


然后我们就发现其实只要是能整除4的都是false,所以这道题就变成了如何判断一个数字是否能整除4。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: