= =拖延症真的没办法…本来打算周更的也变成了半月更…
顺利刷了20%了…可喜可贺可喜可贺…_(:з」∠)_
292. Nim游戏 (Nim Game)
-
题目:你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。 -
思路:
其实本问题算是较为基础的尼姆博弈问题。由于了解不深…介绍一下我所知道的基础概念吧…
(1)关于“必胜状态”与“必败状态”
一个状态是 必败状态 当且仅当 它的所有后继都是必胜状态。
一个状态是 必胜状态 当且仅当 它至少有一个后继是必败状态。
(2)SG定理
【目前还在看书研究…是的我又five了】
(3)SG函数 通用解法
首先介绍集合 S S S的 m e x ( ) mex() mex()函数: m e x ( S ) = 不 在 S 集 合 中 的 最 小 非 负 整 数 mex(S)=不在S集合中的最小非负整数 mex(S)=不在S集合中的最小非负整数 例如
S 1 = { 1 , 2 , 3 , 4 } , m e x ( S 1 ) = 0 ; S 2 = { 0 , 1 , 3 , 4 } , m e x ( S 2 ) = 2 ; S 3 = { } . m e x ( S 3 ) = 0 S_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 S1={1,2,3,4},mex(S1)=0 ;S2={0,1,3,4},mex(S2)=2 ;S3={}.mex(S3)=0
对于SG函数有:
S G ( x ) = m e x ( S ) , 其 中 S 为 x 所 有 后 继 状 态 的 集 合 SG(x)=mex(S),其中S为x所有后继状态的集合 SG(x)=mex(S),其中S为x所有后继状态的集合
另有:
S G ( x ) = 0    ⟺    x 为 必 败 状 态 SG(x) = 0 \iff x为必败状态 SG(x)=0⟺x为必败状态
(当然对于这个题,为了刷排名…可以找到判别式…因为这个题简单…其他尼姆博奕题目还是需要利用SG函数的解法【嘿嘿没想到吧.jpg】8说了,摸鱼摸鱼)
class Solution {
public boolean canWinNim(int n) {
return n%4!=0;
}
}
[另一道利用SG函数解尼姆博弈的问题下次补充…]