博弈论之正反Nim博弈

硬币谜题游戏开发全解析:从算法到工程实践 状态空间搜索是计算机科学中解决组合优化问题的核心方法,其原理是通过系统性地探索所有可能的状态转移来寻找最优解或可行解。在博弈论和人工智能领域,这一技术被广泛应用于求解确定性游戏的最优策略,其技术价值在于能够为规则明确的决策问题提供理论上的必胜解法。典型的应用场景包括棋类游戏AI、自动化谜题求解以及决策优化模拟器等。本文以经典的硬币翻转谜题为具体案例,深入剖析了如何将游戏规则抽象为数学模型,并利用极小化极大算法和动态规划技术实现必胜策略求解。文章详细探讨了状态压缩、Alpha-Beta剪枝等性能优化手段,并介 阅读详情

Nim 博弈

正向博弈

P2197 【模板】Nim 游戏 - 洛谷
玩家轮流从若干堆物品中的某一堆物品取若干数量物,最终取完者为胜

结论:有 n 堆物品,数量分别为 a 1 , a 2 , a 3 . . . a n a_{1},a_{2},a_{3}...a_{n} a1​,a2​,a3​...an​

  • 若: a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n = = 0 a_{1}⊕a_{2}⊕a_{3}⊕...⊕a_{n}==0 a1​⊕a2​⊕a3​⊕...⊕an​==0 则后手赢
  • 若: a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n   ! =   0 a_{1}⊕a_{2}⊕a_{3}⊕...⊕a_{n} ~!=~0 a1​⊕a2​⊕a3​⊕...⊕an​ != 0 则先手赢
    证明:
    首先,胜者的最终状态肯定是 0 ⊕ 0 ⊕ . . . ⊕ 0 0⊕0⊕...⊕0 0⊕0⊕...⊕0
    然后有两条:
    总异或和为 0 的可以经过一步骤到–>总异或和不为 0 …①
    总异或和不为 0 的可以经过一步骤到–>总异或和为 0 …②

^和 == 0 ↔    经过一步拿取 \xleftrightarrow{\text{~~~经过一步拿取}}    经过一步拿取 ​ ^和 != 0(也就是说每一堆物品数的异或和是由 0
非 0 之间相互转换的)

所以肯定是先碰上异或和为 0 的状态的那个人在经过堆物品数的异或和由 0 与非 0 相互转换的操作后优先碰上胜者的胜利状态(也就是都取完的全 0 状态)

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false); // 关闭同步,提高输入输出效率
    cin.tie(nullptr);            // 解绑 cin 与 cout

    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        int eor = 0;
        for (int i = 0; i < n; ++i) {
            int x;
            cin >> x;
            eor ^= x;
        }
        if (eor != 0) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
    }

    return 0;
}

反向博弈

P4279 [SHOI2008] 小约翰的游戏 - 洛谷

玩家轮流从若干堆物品中的某一堆物品取若干数量物,最后取物品者输

从以下三种情况考虑

  • 每一堆的物品数都是 1(先手根据物品堆数是奇数还是偶数,判断自己的输赢)

  • 只有一堆大于 1,其他堆都是 1(此时先手可以根据物品数等于 1 的堆数来安排自己的后续操作来保证自己赢,也就是说此时的先手是稳赢的)
    例如此时情况为:
    <1> 1 1 1 5,先手拿 5 个成了 1 1 1(回到了第一种情况可以判断自己的输赢,此时先手必赢)
    <2> 1 1 5, 先手拿 4 个成了 1 1 1(同上,先手赢)

  • 若干堆大于 1 ,若干堆等于 1 (这种状态下,经过一系列的操作,肯定可以得到第二种状态的 只有一堆大于 1 ,其余全是 1(其中第二种状态的这种情况的总异或和不为0),加上正向 Nim 博弈的①和②的结论=>异或和在非 0 和 0 之间循环转换,就可以根据此时的 若干堆大于 1 ,若干堆等于 1 状态的异或和来判断谁先来到 只有一堆大于 1,其他堆都是 1 的必赢状态,则谁就赢)
    其中判断方法就是:
    <1> 若先手此时处于 若干堆大于 1 ,若干堆等于 1 的状态且堆数的异或和为 0,则经过异或和的 0 与非 0 的循环转换,每次轮到他时此时的堆的状态都是异或和为 0,则后手则每次轮到他时的堆的状态都是异或和非 0 。因为必赢状态(只有一堆大于 1,其他堆都是 1)的异或和为非 0。故最后肯定是后手达到这种必赢状态,那么也就是后手赢
    <2>反之亦然

综上,该题的思路是:
<1>如果物品堆数的初始状态是 每一堆物品都是0,则先手根据物品堆数的奇偶性判断输赢
<2>如果物品堆数的初始状态是 只有一堆大于 1,其他堆都是 1,这种情况是必赢状态,因为此时先手可以根据物品数为 0 的堆的个数灵活拿取,来构造可以使得自己赢的情况
<3>如果物品堆数的初始状态是 若干堆大于 1 ,若干堆等于 1 ,这种情况最常见。先手可以根据此时的堆物品数的异或和以及最优解是堆物品数的异或和在 0 与非 0 之间相互转换的规律来判断是自己先达到 只有一堆大于 1,其他堆都是 1 的必赢状态还是对手先达到 只有一堆大于 1,其他堆都是 1 的必赢状态来判断自己的输赢

#include <iostream>
using namespace std;

const int MAXN = 51;
int stones[MAXN];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t, n;
    cin >> t;

    while (t--) {
        cin >> n;
        int eor = 0;     // 异或和:用于判断当前局势对先手是否有利
        int ones = 0;    // 统计物品数为 1 的堆数

        for (int i = 0; i < n; ++i) {
            cin >> stones[i];
            eor ^= stones[i];
            if (stones[i] == 1) {
                ones++;  // 记录物品数为 1 的堆
            }
        }

        // 情况一:每一堆物品数都是 1
        // 分析:此时的胜负只与堆数的奇偶性有关
        //      - 如果堆数是奇数,先手最后必然面对一个堆 -> 输(Brother 赢)
        //      - 如果堆数是偶数,先手可对称操作 -> 赢(John 赢)
        if (ones == n) {
            cout << ((n % 2 == 1) ? "Brother" : "John") << '\n';
        }

        // 情况二 + 情况三:存在一堆或多堆物品数大于 1
        else {
            // 情况二:只有一堆物品数大于 1,其余全是 1
            // 说明:这是先手必胜的情况,先手可以操作该堆变成情况一中的奇偶局面,使自己最终胜出

            // 情况三:若干堆 >1,若干堆 =1
            // 思路:经过博弈后必然转化为情况二,谁能将游戏引导到情况二中的非 0 异或状态,谁就能赢
            // 判定:如果异或和 ≠ 0,说明当前是先手可控状态 -> John 赢
            //       如果异或和 = 0,说明后手将控制游戏走向必胜态 -> Brother 赢
            cout << ((eor != 0) ? "John" : "Brother") << '\n';
        }
    }

    return 0;
}

CST入门——0. 安装CST Studio Suite 2022 安装CST Studio Suite 2022详细操作步骤 阅读详情

相关推荐

用python将dycom .dcm格式图像转换为nifti .nii

因为发现目前搜索到的多数中文教程并不能正确将FMRI图像正确转换,例如很多用simpleITk的seriesreader的,所以写了一下自己正确转换的方法。因为FMRI是一个4D数据,有时间轴,所以用seriesreader读写出来的图像把时间轴维度给降维了。当然你用SPM12工具的dycom import也是能正确转换的,但是我还是喜欢python这样的,代码直接简单。

qq_41103479的博客 3609

【博弈论】翻硬币游戏8种模型

翻硬币游戏 一般的翻硬币游戏的规则是这样的: N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,**最右边那个硬币的必须是从正面翻到反面。**例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不能翻谁输。 有这样的结论:局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG 值的异或和。即一个有k个硬币朝上,朝上硬币位置分布在的翻硬币游戏中,

weixin_52308504的博客 1574

CNN经典网络模型(二):AlexNet简介及代码实现(PyTorch超详细注释版)

CNN经典网络模型之一:AlexNet,本文包含其简介及代码,在PyTorch中实现,进行超详细注释,适合新生小白阅读学习~

qq_43307074的博客 2万+

博弈学习笔记

博弈 Tags:数学 作业部落 评论地址 前言 本博文分三部分,第一部分简单介绍SG函数,第二部分简单介绍博主所理解的一些博弈模型,第三部分推荐题目以及分享做题心得,本文基本不适合初学者食用,初学者请移步下方链接 论文:2009贾志豪(百度文库可搜) 自为风月马前卒的总结 自为风月马前卒的题目 orz yyb Part1 SG函数 优势:可以实现对多个游戏进行加和 计算方式:\(SG(x)=me...

weixin_30908941的博客 265

连接HP C7000 OA管理口操作文档

必备工具:1台便携式笔记本电脑、1根网线 2、 在C7000机箱背面找到 OA管理模块,如图:图标1和2为OA主备管理模块 将网线一端接至左边的OA管理网口,另一端接至便携式笔记本电脑网口,如图下位置: 在C7000液晶面板下查看OA管理口地址,如图,按下液晶面板的OK按钮 然后按下▼按钮调至Enclosure Info这一项后,按下OK按钮,输出界面如图:可以看到当前Active的OA管理口IP地址 比如显示地址为172.16.25.30,则个人笔记本电脑则配置172.16...

马晓援的博客 6011

「Unity3D」Addressable版本冲突解析:SBP与Addressables兼容性问题实战指南

本文深入解析Unity3D中Addressable与SBP(Scriptable Build Pipeline)版本冲突问题,提供实战解决方案。当遇到「Build Task CreateBuiltInShadersBundle failed」错误时,可通过版本匹配、临时资源引用或构建参数调整解决。文章详细分析兼容性原理,并给出版本组合指南与最佳实践,帮助开发者高效处理资源构建问题。

weixin_29001683的博客 409

博弈题目小结

闲聊最近一周基本上都在看博弈,也看了几篇大家所说的经典的论文,今天稍微总结一下博弈中常见的题目类型。还有,入门的时候真的很推荐去看张一飞的那篇论文,有很详细的引入过程,我之前一直不是很理解为什么nim游戏就能和异或扯上关系……看完这篇论文后才有些理解。Nim Gamenim游戏真的是很经典的游戏,很多种游戏都是由它延伸变形而来。 规则如下:n堆石子,双方轮流从任意一堆石子中取出至少一个,不能取的人

ciel_s的博客 1148

3个国产AI大模型实战:如何用DeepSeek+豆包+千问批量生成高质量测试用例(附完整代码)

本文详细介绍了如何利用DeepSeek、豆包和千问三大国产AI大模型批量生成高质量测试用例的实战方法。通过Python环境配置、多模型SDK安装和统一接口封装,实现高效测试用例生成,并结合结构化提示词设计和多模型结果对比分析,显著提升测试效率和覆盖率。

weixin_29197699的博客 707

博弈论翻硬币游戏

翻硬币游戏     一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不能翻谁输。     有这样的结

zhiyuanjiang的博客 2123

OpenCL编译环境配置

在 Linux 系统上配置 OpenCL 开发环境需要安装适当的驱动、运行时和开发工具。

深之JohnChen的专栏 1999

37、深入解析SCTP与RTP传输协议

本文深入解析了SCTP与RTP两种重要传输协议。SCTP提供可靠的多流数据传输,支持关联管理、选择性确认和错误处理,适用于高可靠性场景;RTP则专注于实时音视频数据的低延迟传输,配合RTCP实现质量监控。文章详细介绍了两种协议的数据结构、工作流程及应用场景,并对比其特性,帮助开发者根据可靠性、实时性和多流需求选择合适的协议。

time3的博客 83

博弈论之翻硬币游戏

转载自:http://blog.sina.com.cn/s/blog_8f06da99010125ol.html 翻硬币游戏     一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三...

neuq_zsmj的博客 1248

存储硬盘格式怎么把512还原为520格式??

硬盘厂商工具(如SeaChestsg_format)可以调整扇区大小。备份数据,因为调整扇区会清除硬盘内容。根据硬盘型号和接口类型,选择合适的工具进行调整。如果你需要更详细的帮助,请提供你的硬盘型号和存储设备类型。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1142

博弈——翻硬币游戏

翻硬币游戏     一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不

若忆_star 1865

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【转】博弈论----翻硬币问题

翻硬币游戏     一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不能翻谁输。    ...

speaker__的博客 5783

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

博弈之翻硬币系列

翻硬币游戏是一个很经典的博弈问题。 一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,

大神养成中..... 3667

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

博弈—翻硬币游戏

(下面是比较好的博弈类的文章,但是我觉得文中讲的有些地方不是很好,所以做了一点修改)。  一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。   第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如

中华鲁迅的专栏 1031

博弈-翻硬币

转自:http://blog.sina.com.cn/s/blog_8f06da99010125ol.html 翻硬币游戏 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;一般的翻硬币游戏的规则是这样的: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N&am

qq_34921856的博客 316

博弈-翻硬币游戏

翻硬币游戏 一般的翻硬币游戏的规则是这样的: N枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1到N编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不能翻谁输。 ...

七九河开的博客 555

博弈专题之翻硬币(套路深)(from == kuangbin)

翻硬币游戏     一般的翻硬币游戏的规则是这样的:       N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。 第二,谁不能翻谁输。

AI_xue 1378

翻硬币游戏

【转】博弈-翻硬币游戏 翻硬币游戏 一般的翻硬币游戏的规则是这样的: N枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1到N编号。 第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,...

weixin_30487201的博客 245

hdu3537 Daizhenyang's Coin 翻硬币,(Mock Turtles游戏)

博弈模型,翻硬币游戏的模型可以参考:http://blog.youkuaiyun.com/acm_cxlove/article/details/7854534 这一题的约束条件是可以选取1,2,3枚硬币翻转,对应文章中约束条件六(Mock Turtles游戏): 每次可以翻动一个、二个或三个硬币。(Mock Turtles游戏) 初始编号从0开始。 当N==1时,硬币为:正,先手必

Broken Wings 1224

【转】博弈-翻硬币游戏

一般的翻硬币游戏的规则是这样的: N枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1到N编号。   第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。   第二,谁不能翻谁输。 有这样的...

weixin_34315485的博客 133
上一篇: 算法设计课作业
ByteMaster_
博客等级 码龄3年 328粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值