【LeetCode刷题记】鹅厂秋招题集(2)

= =拖延症真的没办法…本来打算周更的也变成了半月更…

顺利刷了20%了…可喜可贺可喜可贺…_(:з」∠)_
在这里插入图片描述

292. Nim游戏 (Nim Game)

  • 题目:你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
    你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

  • 思路:
    其实本问题算是较为基础的尼姆博弈问题。由于了解不深…介绍一下我所知道的基础概念吧…
    (1)关于“必胜状态”与“必败状态”
      一个状态是 必败状态 当且仅当 它的所有后继都是必胜状态
      一个状态是 必胜状态 当且仅当 它至少有一个后继是必败状态
    (2)SG定理
      【目前还在看书研究…是的我又five了】
    (3)SG函数 通用解法
      首先介绍集合SSmex()mex()函数:mex(S)=Smex(S)=不在S集合中的最小非负整数  例如
    S1={1,2,3,4},mex(S1)=0 ;S2={0,1,3,4},mex(S2)=2 ;S3={}.mex(S3)=0S_1=\{1,2,3,4\} ,mex(S_1)=0\ ; \\ S_2=\{0,1,3,4\},mex(S_2)=2 \ ; \\ S_3=\{\}.mex(S_3)=0
      对于SG函数有:
    SG(x)=mex(S)SxSG(x)=mex(S),其中S为x所有后继状态的集合
      另有:
    SG(x)=0    xSG(x) = 0 \iff x为必败状态

(当然对于这个题,为了刷排名…可以找到判别式…因为这个题简单…其他尼姆博奕题目还是需要利用SG函数的解法【嘿嘿没想到吧.jpg】8说了,摸鱼摸鱼)

class Solution {
    public boolean canWinNim(int n) {
        return n%4!=0;
    }
}

[另一道利用SG函数解尼姆博弈的问题下次补充…]

posted @ 2018-11-30 10:47  MTwz  阅读(131)  评论(0编辑  收藏  举报