leetcode 292. Nim游戏 【easy】

题目:        

你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

示例:

输入: 4输出: false 
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
     因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

思路:

这是博弈论中极为经典的尼姆游戏。有总数为n的石头,每个人可以拿1~m个石头,两个人交替拿,拿到最后一个的人获胜。究竟是先手有利,还是后手有利?

1个石子,先手全部拿走;

2个石子,先手全部拿走;

3个石子,先手全部拿走;

4个石子,后手面对的是先手的第1,2,3情况,后手必胜;

5个石子,先手拿走1个让后手面对第4种情况,后手必败;

6个石子,先手拿走2个让后手面对第4种情况,后手必败;

7个石子,先手拿走3个让后手面对第4种情况,后手必败;


……

容易看出来,只有当出现了4的倍数,先手无可奈何,其余情况先手都可以获胜。

(石子数量为4的倍数)后手的获胜策略十分简单,每次取石子的数量,与上一次先手取石子的数量和为4即可;

(石子数量不为4的倍数)先手的获胜策略也十分简单,每次都令取之后剩余的石子数量为4的倍数(4*0=0,直接拿光),他就处于后手的位置上,利用上一行的策略获胜。

代码:

class Solution:
    def canWinNim(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n%4 == 0:
            return False
        else:
            return True

猜你喜欢

转载自blog.csdn.net/weixin_40449071/article/details/82892730
今日推荐