题目链接:
题目描述:
两个人取一堆石子,每人移走1、2、3块石头,移除最后一个石子的人获胜,把自己作为第一个取石子的人,在游戏中我们总是采取最优策略来取石子,以获得最后的胜利。
题目解释:
由题目描述我们可以得出一下几点:
- 用户本身作为第一个取石子的人。
- 采取最优策略,也就是说最后的结果是唯一的:要么赢要么输。
- 如何取石子已经不重要了。
解题方案:
最开始的时候,我的想法是采用递归的方法遍历所有可能的方案,只要找到一个获胜的,我们就可以断定用户可以赢,但是这种方法效率太慢了,会不会有O(1)时间复杂度的解决方法呢?像这样的题目一般都会有数学规律或者一个公式。我列出了一下情况:
石头数 比赛结果
1———- win
2———–win
3———–win
4———–lost
5———–win
6———–win
7———–win
8———–lost
9———–win
10———win
11———win
12———lost
从上面的规律我们可以发现:4的倍数,用户必输,其他情况用户必赢。
所以这道题我们只要判断石子数是否为4的倍数即可,若为4的倍数,用户必输,其他情况用户必赢
下面来看AC代码(C语言版本):
bool canWinNim(int n)
{
if(n % 4 == 0)
{
return false;
}
return true;
}