甩锅——LeetCode 292号问题

232 阅读1分钟

Nim 游戏

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

分析

  • 我方面对1、2、3块石头时,都可以一次拿完,我方获胜。
  • 我方面对 4 块石头时,拿不完,并且剩下的石头会被对方一次拿完,对方获胜。
  • 因此,如果甩给对方 4 块石头,必定获胜。
  • 同理,只要甩给对方 4n 块石头,无论对方怎么拿,你都可以给他4(n-1)到4(n-2)到4(n-3) ... 到4,获胜。

综上所述,我方先拿,给对方留下4的倍数,我方必定胜利。

算法描述

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

嘤嘤嘤

该问题属于巴什博弈范畴,只要给对方留下 (m+1) 的倍数即可获胜,本题m = 3