news 2026/4/15 15:10:03

nim游戏原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nim游戏原理

参考nim游戏

尼姆博弈 是一个两人博弈。两名玩家轮流从若干堆物品中拿取一定数量的物品,每次操作需:

  1. 选择某一堆。
  2. 从该堆中至少拿 1 个,至多拿完全部物品(不能不拿)。

游戏可以设置“拿到最后一个物品获胜”或“拿到最后一个物品失败”。

视频规则 中,游戏的等价关系不变量是nim 和是否为 0,详细解释。


定义 1:nim 和

所有堆的异或和定义为nim 和

例子
对状态(3, 5, 7),nim 和计算为:
nim(3,5,7) = 3 ⊕ 5 ⊕ 7 = 1

注:可用浏览器的 JS 计算。


约定 1:状态分类

为了简化证明,将硬币状态分成 5 类:P、Q、R 明显可判定,平衡态 S 与非平衡态 F 是主要讨论对象。

5 类状态的“标准型”指该类形式最简单的状态。

状态类定义标准型
平衡态 Snim 和为 0,且不是 P、Q、Rk₀=(x,x), x>1;k₁=(1,2x,2x+1)
x⊕x=0;1⊕2x⊕(2x+1)=0
非平衡态 Fnim 和不为 0,且不是 P、Q、R(1,2)
奇堆纯 1 态 P仅有奇数堆 1(1)
偶堆纯 1 态 Q仅有偶数堆 1(1,1)
仅 1 堆态 R仅有一堆数量 >1(2)

约定 2:必胜态与必败态

  • P1:P、Q、R 的结果显然,无需讨论。
  • P2(必胜态):若参与者 A 构造状态 U 后存在必胜走法,则 U 为 A 的必胜态。
  • P3(必败态):若参与者 A 构造状态 U 后无必胜走法,则 U 为 A 的必败态。
  • P4:状态 K₀ = (x,x) | x>1 是平衡态,也是必胜态,作为 S 类标准型。
  • P5:参与者 A 为平衡态构造者。
  • P6:最高位、s 位等均指二进制位。
  • P7
    • 状态 (s) 表示只有一个 s 个硬币堆,其他堆为 0。
    • 状态 (s,t) 表示只有两堆,分别有 s 和 t 个硬币,其他堆为 0。
  • P8(并堆):状态间的一种运算,用 ⊕ 表示,nim((s) ⊕ (t)) = s ⊕ t。

结论

  • 平衡态 ⊕ 平衡态 = 平衡态
  • 非平衡态 ⊕ 平衡态 = 非平衡态

定理 1:平衡态是必胜态,非平衡态是必败态

不论规则是“拿到最后一个赢”还是“拿到最后一个输”,都成立。
记住:拿成平衡态者获胜

T1:K₀ 是平衡态

  • K₀ = (0,0,…,x,x)
  • 因为 nim(K₀) = x ⊕ x = 0,所以 K₀ 是平衡态。

T2:K₀ 是必胜态

下一步 B 拿后的状态为 (m,X),分类讨论:

m规则A 拿法结果
0拿最后一个赢A 把 X 堆全拿走A 赢
0拿最后一个输A 把 X 堆剩 1 个A 赢
1拿最后一个赢A 把 X 堆剩 1 个A 赢
1拿最后一个输A 把 X 堆全拿走A 赢
>1拿最后一个赢A 把 X 堆剩 m 个回到 P2 步骤
>1拿最后一个输A 把 X 堆剩 m 个回到 P2 步骤

因硬币数严格递减,总会结束于上表绿色情况。

T3:平衡态的下一个状态一定不平衡

设平衡态 nim 和为 0,从第 j 堆拿后剩 m 个:
t ⊕x j x_jxj= m, t>0

则下一状态 nim 和 = t > 0,不平衡。

T4:不平衡态的下一状态可平衡也可不平衡

设不平衡态 t>0,其最高位为 s,存在某堆 x_j 的第 s 位为 1,则可以通过调整 x_j 堆的数量:

  • 拿成平衡:A 拿剩 t ⊕x j x_jxj个,使 nim 和变 0
  • 拿成不平衡:A 拿走该堆小于 s 位的部分,使 nim 和 s 位保持不平衡

T5:存在拿法使构造 S 的 A 最终获胜

必胜表:

规则必胜态必败态
拿最后一个赢K₀, S, QP, F, R
拿最后一个输K₀, S, PQ, F, R

A 可通过拿到 K₀、P 或 Q 获胜,B 最终走向必败态 F1 或 F2。

T6:只要 A 尽可能保持平衡,B 必经 F1 或 F2

  • F1 = (1,1,…,1,m), m>1, nim>0
  • F2 = (0,0,…,x,m), x,m>1, nim>0, x≠m

硬币有限,最终状态必终结于 K₀ 或 F2。


推论 1

  • K₀、K₁ 是必胜态
  • 平衡态的并堆也是必胜态

因异或运算难口算,推论可快速判定大多数状态是否必胜。


平衡态构造技巧

口诀

x j x_jxj堆拿剩x j x_jxj⊕ t 个,直到 P、Q、R 状态
其中 t 为 nim 和,x j x_jxj为与 t 最高位相同的堆。

技巧总结:

技巧说明
技巧1K₀ = (x,x)
技巧2K₁ = (1,2x,2x+1)
技巧3奇数个奇堆不平衡,只看个位
技巧4x j x_jxj堆拿剩x j x_jxj⊕ t 个,直到 P,Q,R 状态,需要大量异或计算
技巧5平衡状态下,随便只拿一个
技巧6并堆定理
技巧7a 是最大堆,将 a 堆剩下 b^c
技巧8(a^b^c).toString(2).toString(2)

可以通过如下脚本确定如何拿硬币

/** * 状态s下,如何拿硬币 * @param s {Array[number]} - 输入的数字数组 * @return {[number,number,number]} - 返回一个包含三个数字的数组: * 状态s的nim和 * xj堆的数量 * xj堆剩下的数量 */functionnim(s){//计算状态s的nim和constt=s.reduce((acc,cur)=>acc^cur,0);letxj=Math.max(...s);//必败态,就从最大堆拿一个if(t===0){return[t,xj,xj-1];}//找出xj堆for(letitofs){if((it>>(t.toString(2).length-1))&1===1){xj=it;break;}}//xj堆剩下的数量return[t,xj,xj^t];}/** * 状态s的下一个最佳状态 * @param s {Array[number]} 当前状态 * @return {Array[number]} 下一状态 */functionm(s){s=Array.isArray(s)?s:[...arguments];const[t,xj,nextXj]=nim(s);letflag=0;letnextS=s.map((it)=>{if(flag===0&&it===xj){flag=1;returnnextXj;}else{returnit;}});if(t===0){thrownewError("可能会输:"+nextS.toString());}returnnextS;}m(3,5,7)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 20:23:30

一个 Bug,把 MIT 工程师从谷歌逼醒

当“金手铐”遇上高度内卷的内部技术栈在硅谷,离开谷歌,常被视为一种“反理性选择”。 稳定的高薪、极致的福利、全球顶级的工程团队——这些条件叠加在一起,构成了一副闪闪发光的“金手铐”。但对一位毕业于 麻省理工学院、曾在 谷歌 搜索与…

作者头像 李华
网站建设 2026/4/16 12:27:33

spring项目中业务逻辑涉及异步调用

两种异步模型的分叉点 Async 和CompletableFuture.supplyAsync(() -> { … }) 正面对比 一、两种写法放一起看 👇 1️⃣ 你现在用的(Spring 推荐,企业级) Async public void runTaskAsync(String pasaTaskId, String daHost, S…

作者头像 李华
网站建设 2026/4/15 19:54:42

基于SMO滑模观测器算法的永磁同步电机无传感器矢量控制

基于SMO滑模观测器算法的永磁同步电机无传感器矢量控制的仿真模型C代码: 1. 完整的SMO滑模观测器算法的C代码,本人已经成功移植到DSP(TMS320F28335)芯片中,在一台额定功率为45kW的永磁同步电机的变频器中加以应用&…

作者头像 李华
网站建设 2026/4/13 21:23:35

MySQL 8.0安装

一、MySQL 8.0安装前准备工作 (一)下载MySQL 8.0安装包 官网下载: 打开浏览器,访问 MySQL 官方网站在下载页面中,找到 “MySQL Community Server” 选项,点击 “Download” 按钮。选择适合自己操作系统的…

作者头像 李华
网站建设 2026/4/16 10:59:40

Java+React全栈开发面试宝典(完整60题)

📌 Java后端篇(15题) 1. 说说JVM的内存结构? 答案框架(记忆口诀:堆栈方本程) JVM内存分为5个区域: 堆(Heap):存放对象实例,是GC的主要区域,分为新生代(Eden、S0、S1)和老年代 栈(Stack):每个线程私有,存局部变量、方法调用,栈帧包含局部变量表、操作数…

作者头像 李华
网站建设 2026/4/16 14:28:55

CCF-GESP计算机学会等级考试2025年12月四级C++T2 优先购买

B4452 [GESP202512 四级] 优先购买 题目描述 小 A 有 MMM 元预算。商店有 NNN 个商品,每个商品有商品名 SSS、价格 PPP 和优先级 VVV 三种属性,其中 VVV 为正整数,且 VVV 越小代表商品的优先级越高。 小 A 的购物策略为: 总是优先…

作者头像 李华