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