LeetCode 292: Nim Game (Nim游戏)

原创 2015年11月20日 19:36:06

LeetCode 292: Nim Game (Nim游戏)

原题目:

You are playing the following Nim Game with your friend:
There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner.
Write a function to determine whether you can win the game given the number of stones in the heap.
For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.

题目大意:

你和你的朋友要玩Nim游戏,游戏规则如下:
1. 地上有一堆石子,你和你的朋友依次可以从中拿走1到3枚;
2. 谁在最后一次将地上的石子拿完就是游戏的胜者;
3. 游戏开始时,你先拿石子;
4. 你们俩都非常聪明,并且都会玩这个游戏的最优策略。
写一个函数来判定你是否可以在游戏中获胜。例如,如果地上有4枚石子,无论你在首次拿走其中的1,2 或者3枚,最后的石子剩下的石子都会被你的朋友一次拿完,也就是说你不可能胜。

题目分析:

Nim游戏是博弈论中最经典的模型,针对本题目中的假设条件,我进行了如下分析:
1. 由于是我先拿石子,所以如果石子是1,2或3枚,那么我必胜;
2. 如果石子的数量n >=4, 那么我第一次是不能拿完的, 我能不能在下一次拿完取决于朋友在拿1, 2,3枚石子之后的情况,如果朋友在拿走1, 2 或者3枚的情况都不能取胜,那么我就能取胜,否则朋友就取胜了,这其实是一个递归。该递归公式如下:
f(n) = true n =1, 2, 3
f(n) = !(f(n-1) && f(n-2) && f(n-3))
3. 根据数学归纳法分析:n = 1 f(n) =true; n = 2 f(n) =true; n = 3 f(n) =true; n = 4 f(n) =false; n = 5 f(n) =true; n = 6 f(n) =true; n = 7 f(n) =true; n = 8 f(n) =false; n = 9 f(n) =true; n = 10 f(n) =true; n = 11 f(n) =true; n = 12 f(n) =false;…
可以得出其实如果n不是4的整数倍,我就会赢。

题解代码:

(1) 递归法:

class Solution {
public:
    bool canWinNim(int n) {
        if ((n == 1) || (n == 2) || (n ==3)) {
            return true;
        }
        if (canWinNim(n - 1) && canWinNim(n - 2) && canWinNim(n - 3)) {
            return false;
        } else {
            return true;
        }
    }
};

这种解法可以解决问题,但是我提交LeetCode时显示超时,耗时比较大,一直想换成循环可能要快些,但是没有想出来代码怎么写。

(2)数学分析结论:

class Solution {
public:
    bool canWinNim(int n) {
        if (n % 4 != 0) {
            return true;
        } else {
            return false;
        }
    }
};

LeetCode292——Nim Game(一行代码解决)

You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac...
  • booirror
  • booirror
  • 2015年10月20日 23:58
  • 8382

LeetCode 292 Nim Game(Nim游戏)

翻译你正在和你的朋友们玩下面这个Nim游戏:桌子上有一堆石头,每次你从中去掉1-3个。谁消除掉最后一个石头即为赢家。你在取出石头的第一轮。你们中的每一个人都有着聪明的头脑和绝佳的策略。写一个函数来确定...
  • NoMasp
  • NoMasp
  • 2015年12月23日 20:24
  • 5459

LeetCode(292) Nim Game

题目You are playing the following Nim Game with your friend: There is a heap of stones on the table, e...
  • fly_yr
  • fly_yr
  • 2015年11月27日 15:58
  • 935

【LeetCode从零单刷】Nim Game

【LeetCode从零单刷】Nim Game
  • yOung_One
  • yOung_One
  • 2015年10月13日 16:42
  • 7789

[leetcode-292]Nim Game(java)

问题描述: You are playing the following Nim Game with your friend: There is a heap of stones on the tab...
  • zdavb
  • zdavb
  • 2015年10月13日 14:46
  • 1082

292. Nim Game [easy] (Python)

题目链接https://leetcode.com/problems/nim-game/题目原文 You are playing the following Nim Game with your f...
  • coder_orz
  • coder_orz
  • 2016年05月10日 17:17
  • 1467

nim游戏详解(易懂)

Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。 后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,...
  • Summer__show_
  • Summer__show_
  • 2017年04月15日 16:57
  • 1726

Nim 游戏及其变形

Nim 在博弈中经常出现,很多看似复杂的题目,在分析和变形之后就回归了最初的nim游戏。 经典的nim游戏 一共有N堆石子,编号1..n,第i堆中有个a[i]个石子。 每一次操作Alice和Bob...
  • clover_hxy
  • clover_hxy
  • 2016年12月22日 20:25
  • 1617

Nim 游戏和 SG 函数

Nim游戏Nim游戏定义Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。满足以下条...
  • Zarth
  • Zarth
  • 2016年04月30日 23:12
  • 867

Nim游戏,Grundy函数介绍

Nim游戏,Grundy函数介绍部分翻译自:http://www.cut-the-knot.org/ctk/May2001.shtmlNim是一种很古老又很迷人的双人参与的数学游戏。这个游戏的名字和相...
  • mystoryfantacy
  • mystoryfantacy
  • 2016年06月10日 21:01
  • 413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode 292: Nim Game (Nim游戏)
举报原因:
原因补充:

(最多只允许输入30个字)