Nim游戏


Nim游戏

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
你和你的朋友,两个人一起玩 Nim 游戏:
桌子上有一堆石头
你们轮流进行自己的回合, 你作为先手
每一回合,轮到的人拿掉 1 - 3 块石头
拿掉最后一块石头的人就是获胜者

假设你们每一步都是最优解 请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏
如果可以赢,返回 true;否则,返回 false

示例 1:

输入:n = 4
输出:false
解释:以下是可能的结果:
1. 移除1颗石头 你的朋友移走了3块石头,包括最后一块 你的朋友赢了
2. 移除2个石子 你的朋友移走2块石头,包括最后一块 你的朋友赢了
3.你移走3颗石子 你的朋友移走了最后一块石头 你的朋友赢了
在所有结果中,你的朋友是赢家

示例 2:
输入:n = 1
输出:true

示例 3:
输入:n = 2
输出:true

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
思路:
这是一道数学题
拿走最后一块石头的人获胜,也就是说获胜的人最后一轮得到的石头数量为1,2,3
所以只有将4块是否交给对方才能一定获胜, 对方会用各种方法将4交到我方
自己是先手,所以胜利范围是1,2,3 + 4*n
如果能被4整除,最后一定能将4交到我方,因为双方范围是1-3,无论己方拿几块石头,对方都可以让数量变成4的倍数

先手方想赢,必须把石头控制成4的倍数给后手方,这样对方不可能控制成4的倍数返回
后手方想赢,必须要石头控制成4的倍数给先手方,取决于一开始的时候是不是4的倍数,如果是,则先手方拿取石头后一定不是4的倍数

代码:
/**
* @param Integer $n
* @return Boolean
*/
function canWinNim($n) {
return $n % 4 != 0;
}