Nimm Game

news/2025/10/21 16:22:55/文章来源:https://www.cnblogs.com/xiaoxiongtaotao/p/19155731

模型介绍

Nim Game 是博弈论中最著名且最重要的模型之一,规则如下:

  • \(n\) 堆物品,每堆分别有 \(a_1,a_2,\cdots,a_n\) 个;
  • 两名玩家轮流操作;
  • 每次只能从某一堆中取任意数量的物品(至少 \(1\) 个,至多取完该堆);
  • 最后取光所有物品的玩家获胜。

历史背景

Nim Game 的历史可以追溯到中国古代,但现代博弈论中的系统研究始于 \(1901\) 年 Charles L. Bouton 的论文。Bouton 提出了完整的理论解决方案,使 Nim Game 成为第一个被完全解决的组合博弈问题。

核心结论与证明

Bouton 定理

对于 Nim Game,定义尼姆和(Nim-sum)为所有堆大小的异或和:

\[S=a_1\oplus a_2\oplus\cdots\oplus a_n \]

结论:

  • 如果 \(S=0\),先手必败;
  • 如果 \(S\neq0\),先手必胜。

证明

基本思路:

  • 终局状态(所有堆为 \(0\))的尼姆和为 \(0\),是必败态;
  • 从尼姆和非 \(0\) 的状态,总可以一步操作到达尼姆和为 \(0\) 的状态;
  • 从尼姆和为 \(0\) 的状态,任何操作都会到达尼姆和非 \(0\) 的状态。

详细证明:

  1. 引理 \(1\):如果 \(S=0\),则任何合法操作都会使 \(S\neq0\),证明:
  • 假设从第 \(i\) 堆取走 \(k\) 个物品 \((0<k\le a_i)\)
  • 新的堆大小 \(a_i'= a_i-k\)
  • 新的尼姆和 \(S'=S\oplus a_i\oplus a_i'=0\oplus a_ᵢ\oplus(a_i-k)=a_i\oplus(a_i-k)\)
  • 由于 \(k>0\),所以 \(a_i\neq a_i-k\),因此 \(S'\neq0\)
  1. 引理 \(2\):如果 \(S\neq0\),则存在合法操作使 \(S'=0\),证明:
  • \(S\) 的最高位是第 \(d\) 位;
  • 存在某个 \(a_i\) 的第 \(d\) 位为 \(1\)(否则 \(S\) 的第 \(d\) 位不可能为 \(1\));
  • \(x=a_i\oplus S\),则 \(x<a_i\)(因为 \(a_i\)\(x\) 在第 \(d\) 位以上的位相同,但 \(a_i\) 的第 \(d\) 位为 \(1\)\(x\) 的第 \(d\) 位为 \(0\));
  • 从第 \(i\) 堆取走 \(a_i-x\) 个物品,使该堆变为 \(x\)
  • 新的尼姆和 \(S'=S\oplus a_i\oplus x=S\oplus a_i\oplus(a_i\oplus S)=0\)

归纳证明:

  • 基础:终局状态 \(S=0\) 是必败态;
  • 归纳:
  1. 如果 \(S=0\),任何操作都到 \(S\neq0\)(引理 \(1\));
  2. 如果 \(S\neq0\),存在操作到 \(S=0\)(引理 \(2\));
  • 因此结论成立。

代码实现

基础判断与策略

#include <bits/stdc++.h>
#define int long longusing namespace std;// 计算尼姆和
int calculateNimSum(const vector<int>& piles) {int nim_sum = 0;for (int pile : piles) {nim_sum ^= pile;}return nim_sum;
}// 判断先手是否必胜
bool canWinNim(const vector<int>& piles) { return calculateNimSum(piles) != 0; }// 找到必胜策略
pair<int, int> findWinningMove(const vector<int>& piles) {int nim_sum = calculateNimSum(piles);if (nim_sum == 0) {return {-1, -1};  // 没有必胜策略}// 找到第一个可以操作的堆for (int i = 0; i < piles.size(); i++) {int target = piles[i] ^ nim_sum;if (target < piles[i]) {return {i, piles[i] - target};}}return {-1, -1};  // 理论上不会执行到这里
}// 显示二进制表示(用于理解)
void showBinaryAnalysis(const vector<int>& piles) {cout << "堆状态分析:" << endl;int nim_sum = 0;for (int i = 0; i < piles.size(); i++) {cout << "堆 " << i << ": " << piles[i] << " = " << bitset<8>(piles[i]) << endl;nim_sum ^= piles[i];}cout << "尼姆和: " << nim_sum << " = " << bitset<8>(nim_sum) << endl;cout << "先手" << (nim_sum == 0 ? "必败" : "必胜") << endl;
}

完整游戏模拟

#include <bits/stdc++.h>
#define int long longusing namespace std;class NimGame {private:vector<int> piles;public:NimGame(const vector<int>& initialPiles) : piles(initialPiles) {}bool isGameOver() {for (int pile : piles) {if (pile > 0) return false;}return true;}bool isValidMove(int pileIndex, int takeCount) { return pileIndex >= 0 && pileIndex < piles.size() && takeCount > 0 && takeCount <= piles[pileIndex]; }bool makeMove(int pileIndex, int takeCount) {if (!isValidMove(pileIndex, takeCount)) return false;piles[pileIndex] -= takeCount;return true;}void printState() {cout << "当前堆状态: ";for (int i = 0; i < piles.size(); i++) {cout << "堆" << i << ":" << piles[i] << " ";}cout << endl;}// 电脑的智能移动pair<int, int> computerMove() {auto move = findWinningMove(piles);if (move.first == -1) {// 必败态,随机移动for (int i = 0; i < piles.size(); i++) {if (piles[i] > 0) {move = {i, 1};  // 随便取1个break;}}}makeMove(move.first, move.second);return move;}const vector<int>& getPiles() { return piles; }
};void playNimGame() {vector<int> initialPiles = {3, 4, 5};NimGame game(initialPiles);bool playerTurn = true;cout << "Nim Game 开始!" << endl;cout << "初始堆: ";for (int pile : initialPiles) cout << pile << " ";cout << endl;showBinaryAnalysis(initialPiles);cout << endl;while (!game.isGameOver()) {game.printState();if (playerTurn) {int pile, count;cout << "你的回合 - 输入堆索引和取的数量: ";cin >> pile >> count;if (!game.makeMove(pile, count)) {cout << "无效移动!请重新输入。" << endl;continue;}} else {auto move = game.computerMove();cout << "电脑: 从堆" << move.first << "取" << move.second << "个" << endl;// 显示分析showBinaryAnalysis(game.getPiles());cout << endl;}playerTurn = !playerTurn;}cout << "游戏结束!" << (playerTurn ? "电脑" : "玩家") << "获胜!" << endl;
}

变种题目与解法

变种 1:最后取者输(Misère Nim)

  • 规则:其他规则相同,但最后取物品的人输;
  • 解法:
  1. 当所有堆都只有 \(1\) 个物品时:如果堆数是奇数,先手必败;偶数则先手必胜;
  2. 其他情况:与正常 Nim 相同,但需要特殊处理全1的情况。
bool canWinMisereNim(const vector<int>& piles) {int nim_sum = 0;bool all_ones = true;for (int pile : piles) {nim_sum ^= pile;if (pile > 1) all_ones = false;}if (all_ones) {return (piles.size() % 2) == 0;  // 堆数为偶数时先手必胜} else {return nim_sum != 0;  // 与正常Nim相同}
}

变种 2:受限 Nim(取石子上限)

  • 规则:每次最多取 \(k\) 个物品;
  • 解法:计算每堆的模 \(k+1\) 值,然后用正常 Nim 策略。
bool limitedNim(const vector<int>& piles, int max_take) {vector<int> mod_piles;for (int pile : piles) {mod_piles.push_back(pile % (max_take + 1));}return calculateNimSum(mod_piles) != 0;
}

变种 3:阶梯 Nim

  • 规则:物品在阶梯上,只能从某一阶移动到下一阶;
  • 解法:只考虑奇数阶(或偶数阶)的物品数量。
bool staircaseNim(const vector<int>& steps) {int nim_sum = 0;for (int i = 1; i < steps.size(); i += 2) {  // 只考虑奇数阶nim_sum ^= steps[i];}return nim_sum != 0;
}

变种 4:Moore's Nim

  • 规则:每次可以从最多 \(k\) 堆中取物品;
  • 解法:计算每堆的二进制表示,检查每一位 \(1\) 的个数模 \(k+1\)
bool mooresNim(const vector<int>& piles, int k) {const int MAX_BITS = 32;for (int bit = 0; bit < MAX_BITS; bit++) {int count = 0;for (int pile : piles) {if (pile & (1 << bit)) {count++;}}if (count % (k + 1) != 0) {return true;  // 先手必胜}}return false;  // 先手必败
}

总结

Nim Game 在博弈论中具有核心地位,其重要性体现在:

  1. 理论基础:第一个被完全解决的组合博弈问题
  2. 优美解法:简单的异或运算解决复杂博弈问题
  3. 广泛适用:通过Sprague-Grundy定理扩展到所有公平组合博弈
  4. 教学价值:理解博弈论基本概念的理想模型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年陶瓷过滤机厂家权威推荐榜:真空/盘式/矿用/全自动/真空带式陶瓷过滤机,固液分离设备,尾矿处理设备,圆盘过滤机专业选购指南

2025年陶瓷过滤机厂家权威推荐榜:真空/盘式/矿用/全自动/真空带式陶瓷过滤机,固液分离设备,尾矿处理设备,圆盘过滤机专业选购指南 行业背景与发展趋势 固液分离技术作为现代工业生产中不可或缺的关键环节,在矿山、…

基于C++的远程键盘监控器设计与实现 - 教程

基于C++的远程键盘监控器设计与实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

2025年医药冷链运输厂家权威推荐榜:药品/临床样本/CAR-T/蛋白/诊断试剂/生物制品/血液/细胞/芯片全程温控,冷藏车/冷藏箱/保温箱/干冰/液氮及国际冷链进出口专业服务

2025年医药冷链运输厂家权威推荐榜:药品/临床样本/CAR-T/蛋白/诊断试剂/生物制品/血液/细胞/芯片全程温控,冷藏车/冷藏箱/保温箱/干冰/液氮及国际冷链进出口专业服务 随着生物医药产业的快速发展,医药冷链运输行业正…

2025 装修公司推荐排行榜单:江苏/浙江/制药厂/厂房/实验室/办公室/店面/净化室装修公司推荐,实测老客复购率与专业能力

引言 工装装修涉及厂房、实验室、净化车间等多场景,不同领域对施工标准、技术规范的要求差异显著,食品、制药、半导体等行业更有严苛的合规性要求。当前市场中,部分企业存在技术能力不足、施工质量参差、售后保障缺…

零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读

本文部分总结于 8 月的 LoongSuite 系列公开课及 AI 原生应用实战营 meetup 分享内容。作者:张铭辉(希铭) 本文部分总结于 8 月的 LoongSuite 系列公开课及 AI 原生应用实战营 meetup 分享内容。如需查看原视频欢迎…

xupt 3g移动开发实验室二面

2 B4026 [语言月赛 202409] 灵感 这天,迅风在欣赏某地的美景时,灵感大作,在上午及下午分别写下了两篇文章,而且迅风很喜欢数文章的字数。 具体地,如果迅风在下午写下的文章的字数之和严格大于他在上午写下的文章的…

2025年连铸机设备厂家权威推荐榜:扇形段/大包回转台/钢包中间罐/结晶器总成/拉矫机/输送辊道等核心部件专业解析

2025年连铸机设备厂家权威推荐榜:扇形段/大包回转台/钢包中间罐/结晶器总成/拉矫机/输送辊道等核心部件专业解析 连铸机作为现代钢铁生产中的关键设备,其性能直接影响着钢铁企业的生产效率和产品质量。随着钢铁行业向…

React使用useLocation监听url地址变化,工具URLSearchParams获取参数

React使用useLocation监听url地址变化,工具URLSearchParams获取参数React使用useLocation监听url地址变化,工具URLSearchParams获取参数import * as React from react import { Link, useLocation } from react-router…

碰一碰,秒更新!游戏近场快传助力多人联机无缝组队

在多人联机游戏场景中,玩家组队对战时因游戏版本不一致导致的体验中断问题长期存在。当游戏更新资源包体积庞大时,未及时更新的玩家需依赖网络下载,不仅消耗流量,还因等待时间过长引发用户流失。 HarmonyOS SDK 游…

Moka AI 驱动 HR系统转型实践案例:从技术探索到组织价值落地的全链路解析

Moka AI 驱动 HR系统转型实践案例:从技术探索到组织价值落地的全链路解析作为业内首个 AI 原生 HR SaaS 解决方案提供商,Moka 从 2018 年启动 AI 技术研发至今,已形成 “招聘 - 绩效 - 人才盘点 - 组织发展” 全场景…

2025年服饰厂家权威推荐榜:棒球帽,卫衣,羽绒服源头厂家精选,潮流设计与舒适品质口碑之选

2025年服饰厂家权威推荐榜:棒球帽,卫衣,羽绒服源头厂家精选,潮流设计与舒适品质口碑之选 在当今快节奏的时尚产业中,棒球帽、卫衣和羽绒服已成为不可或缺的日常穿搭单品。随着消费者对品质和设计要求的不断提升,…

字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验

字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验恋猫Flutter & Dart GDE​关注他收录于 移动跨平台开发之家61 人赞同了该文章最近各大厂都在开源自己…

2025年10月北京昌平回龙观酒店推荐:对比评测榜助您锁定高性价比会议与度假之选

一、引言 在京津冀一体化与中关村北部研发服务带双重带动下,昌平回龙观区域已成为科技企业、高校研学、会展活动及周末微度假的高频目的地。对于会议组织者、研学机构、婚宴新人以及希望兼顾通勤便利与配套完善的差旅…

SLS指标监控

SLS指标监控视图预览 阿里云 SLS 指标展示,包括服务状态,日志流量,操作次数,总体 QPS 等。版本支持 操作系统支持:Linux 前置条件服务器 <安装 Datakit> 服务器 <安装 Func 携带版> 阿里云 RAM 访问…

2025年10月北京昌平回龙观酒店推荐榜:五家对比评测与实用选择指南

一、引言 对于需要在昌平回龙观区域安排住宿、会议或婚宴的创业者、企业行政、研学机构及家庭消费者而言,酒店不仅是短暂停留的场所,更是控制综合成本、保障活动流程、提升宾客体验的关键节点。2025年四季度,区域商…

阿里云SLB指标监控

阿里云SLB指标监控视图预览 阿里云 SLB 指标展示,包括后端 ECS 实例状态,端口连接数,QPS,网络流量,状态码等版本支持 操作系统支持:Linux 前置条件服务器 <安装 Datakit> 服务器 <安装 Func 携带版&g…

2025 年最新华侨生联考培训机构口碑推荐榜:聚焦优质教学服务,助力考生高效备考,附详细选择指南

引言 随着华侨生联考报考人数逐年攀升,成为众多华侨、港澳台身份考生通往国内名校的重要途径,市面上的培训机构数量激增,但质量却呈现两极分化态势。部分机构缺乏合规办学资质,教学团队对联考命题趋势把握不足,采…

洛谷题单指南-进阶数论-CF632D Longest Subsequence

原题链接:https://www.luogu.com.cn/problem/CF632D 题意解读:找个最长子序列,使得其LCM<=m 解题思路: LCM最大值为1000000,不妨枚举这个LCM,然后看有多个数是其约数,这样做时间复杂度为n*m。 换一个角度,从…

2025 年最新推荐锯床实力厂家排行榜:龙门 / 数控 / 金属带锯床等多类型设备权威甄选优质企业角度/金属带/双立柱/小型/大型锯床厂家推荐

引言 当前工业制造领域对锯床的需求愈发多元,从龙门锯床、数控锯床到金属带锯床、智能数控锯床等,不同行业、不同生产场景对设备的精度、效率、耐用性要求差异显著。但市场上锯床厂家数量繁杂,部分厂家技术落后、产…

2025织带厂家权威推荐:东莞永沣专业定制防水织带与飞织鞋面

2025织带厂家权威推荐:东莞永沣专业定制防水织带与飞织鞋面 在纺织辅料行业快速发展的今天,防水织带、飞织鞋面等产品已成为鞋服制造中不可或缺的关键组件。随着市场需求不断升级,行业面临着前所未有的技术挑战与创…