Swift 玩转 Nim 博弈:只需一句判断,稳赢所有对手!

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码拆解说明:
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

博弈类题目一直是算法中的“脑筋急转弯”。LeetCode 292《Nim 游戏》是一道非常经典的博弈题,虽然题面看起来像是在做加减法,但实际上背后隐藏着数学思维 —— 谁先出错,谁就输了。

在这篇文章里,我们用 Swift 带你彻底搞懂 Nim 游戏的解法原理,用简单的代码跑出答案,并结合实际场景来聊聊它在策略设计里的用处。

描述

题目给的是一个游戏规则,具体长这样:

  • 桌子上有 n 块石头,两个人轮流拿。
  • 每次只能拿 1 块、2 块或者 3 块。
  • 拿到最后一块石头的人算赢。
  • 你先手,判断你是否一定能赢,前提是双方都足够聪明。

举几个例子说明:

输入: n = 4,输出: false
说明:不管你怎么拿,后手总能赢。

输入: n = 1,输出: true
说明:直接拿走就赢了。

输入: n = 5,输出: true
说明:拿走 1 块,留给对手 4 块,他就输了。

题解答案

这题真正的核心是:如果你一上来面对的数字是 4 的倍数,那你注定要输。

为什么?来,我们换个角度看这件事:

如果轮到你时,桌上有 4 块,你不管拿几块,对方总能刚好拿到剩下的那部分 —— 让你再次面对另一个 4

比如你拿 1 块,剩下 3 块,对方拿 3 块,正好清空;
你拿 2 块,剩 2 块,对方拿 2 块,也是赢;
你拿 3 块,剩 1 块,对方直接拿掉。

换句话说:只要对方每一步都让你面对一个“4 的倍数”,你根本没法赢。

所以你要做的是:让对手面对“4 的倍数”。只要你上来那一步 n % 4 != 0,你就有机会赢。

题解代码分析

好,了解了原理之后,我们来看 Swift 的代码,真的非常简单,只要一行:

func canWinNim(_ n: Int) -> Bool {
    return n % 4 != 0
}

代码拆解说明:

  • n % 4 != 0:表示当前石头数不是 4 的倍数。
  • 如果不是 4 的倍数,那你就可以“调整场面”,逼对方去面对 4。
  • 只要第一次你占了这个主动权,那之后一直赢。

我们可以进一步用一个函数来打印解释过程:

func explainNimGame(_ n: Int) {
    if canWinNim(n) {
        print("你先手,并且可以赢!因为 \(n) 不是 4 的倍数。")
    } else {
        print("你先手,但必输。因为 \(n) 是 4 的倍数,对方只要不犯错,你没机会赢。")
    }
}

示例测试及结果

让我们来跑一些具体例子来看看:

explainNimGame(1)  // 输出:你先手,并且可以赢!
explainNimGame(4)  // 输出:你先手,但必输。
explainNimGame(7)  // 输出:你先手,并且可以赢!
explainNimGame(8)  // 输出:你先手,但必输。
explainNimGame(10) // 输出:你先手,并且可以赢!

结果输出如下:

你先手,并且可以赢!因为 1 不是 4 的倍数。
你先手,但必输。因为 4 是 4 的倍数,对方只要不犯错,你没机会赢。
你先手,并且可以赢!因为 7 不是 4 的倍数。
你先手,但必输。因为 8 是 4 的倍数,对方只要不犯错,你没机会赢。
你先手,并且可以赢!因为 10 不是 4 的倍数。

时间复杂度

O(1)

没错,整个函数就是一个取模运算,速度飞快。

空间复杂度

O(1)

不需要任何额外空间,整个过程只用一个临时变量判断即可。

总结

Nim 游戏看似是个“谁拿得快谁赢”的小技巧题,但背后其实藏着博弈论的精髓 —— 构建对手的失败路径,让对方“无论怎么选都输”

Swift 实现这道题其实只用了一行,但理解它需要一点数学直觉。你掌握了这题,其实也掌握了很多博弈问题的解法模式,像是:

  • 斐波那契博弈
  • 取硬币游戏
  • 阶梯跳跃游戏

在真实场景中,这类策略常用于:

  • 游戏 AI 的局面控制(让玩家处于被动)
  • 编译器里的语义识别(比如模式匹配)
  • 安全规则的防守策略(比如防御者控制攻击窗口)

希望这篇文章帮你用 Swift 更轻松地理解了 Nim 游戏的逻辑。如果你想了解更多博弈题在工程中的实际应用,我们也可以继续深入讨论!

你可能感兴趣的:(Swift,swift,开发语言,ios)