博弈论---Nim游戏(公平组合游戏,概念,证明异或为0就是必败态,示例)

目录

概念: 

公平组合游戏ICG

有向图游戏

Nim游戏

先手)必胜状态

先手)必败状态

如何确定先手是否必胜或者必败(都采用最优策略)

证明:全部异或为0则是必败状态

   综上:

例子


概念: 

公平组合游戏ICG

    若一个游戏满足:
        1.由两名玩家交替行动;
        2.在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;
        3.不能行动的玩家判负;
     则称该游戏为一个公平组合游戏。
     NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。 

有向图游戏

     给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负,该游戏被称为有向图游戏。

     任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。 

Nim游戏

    NIm就是一种公平组合游戏。

     Nim游戏是一个古老的数学游戏,通常由两名玩家轮流进行。游戏使用一堆物品,例如棋子、石头或者硬币,这些物品被分成几堆,每堆可以有任意数量的物品。玩家在每一回合可以选择一堆物品,并且从中取走任意数量的物品,但是至少要取走一个。最后取走最后一个物品的玩家获胜。

     Nim游戏的关键在于掌握取物品的策略,因为有正确的方法可以确保你获胜,无论对手怎么移动。这个策略涉及到让每一堆物品的数量保持在特定的模式,这样你就可以控制游戏的走向,迫使对手进入必败局面。

     Nim游戏可以有很多变种和扩展,包括多堆物品、多个玩家或者其他规则的变化。

  • 先手)必胜状态

    先手进行某一个操作,留给后手是一个必败状态 时,对于先手来说是一个必胜状态。即先手可以走到某一个必败状态

  • 先手)必败状态

    先手不管使用什么策略,都只留给后手必胜的状态。

  • 如何确定先手是否必胜或者必败都采用最优策略)

   我们使用异或(XOR)运算来确定每一堆物品的数量。

  1. 如果所有堆物品的数量进行异或结果为0,则这是一个必败状态。
  2. 否则,是一个必胜状态。
  • 证明:全部异或为0则是必败状态

分情况讨论:

      1.当所有堆的物品数目都为 00\oplus0\oplus0....\oplus0 = 0

      2.当前存在 a_1\oplus a_2...\oplus a_ n = x \neq 0 

        证明,一定可以通过某种方式(减少某些物品的数量)使得情况2的异或值变为 0 。

           假如 x 的二进制表示中最高的一位 1 在第 k 位。

           那么意味着 a_1,\ a_2,\ ...a_n 中必然至少存在一个数 a_ia_i 的第 k 位的值是 1 。

           那么 a_i > a_i \oplus x  , a_i - (a_i \oplus x ) 是合法的 。

           现在将拿走 a_i 中 a_i - (a_i \oplus x ) 数量的东西,则a_i-(a_i - (a_i \oplus x )) = a_i\oplus x 。

           拿走之后所有堆的物品数目再进行异或: a_1\oplus a_2...\oplus a_i\oplus x\oplus a_ n = x\oplus x = 0

           证明完成。

      3.当前 a_1\oplus a_2...\oplus a_ n = 0

         证明,不管证明去拿多少数目(\neq 0),剩下的所有数异或值都不是0

            反证:假设拿出 a_i 中 k(k \neq 0) 个数目,剩余 a_i^`   ,剩下所有数的异或值为 0 

            则有 a_1\oplus a_2...\oplus a_i^`\oplus a_ n = 0        ①

            原有  a_1\oplus a_2...\oplus a_i\oplus a_ n = 0      ②

            再将 ① 和 ② 者进行异或运行,相同的数就被抵消掉,剩余 a_i^` \oplus a_i = 0

            a_i^` \oplus a_i = 0   说明 a_i^` = a_i ,与假设矛盾。证明完成

   综上:

        当全是0的时候,那么先手必输。

        如果当前先手中数目异或不为 0,那么可以取出某个数的值使得轮到后手时,手中数目异或值为 0。后手不管怎么拿,再次轮到先手时,异或值都不会为 0。保证了先手始终 异或不为 0 的状态,而后手始终为 0 的状态,最后后手会首先遇到全 0 状态,先手始终处于必胜态

        如果先手一开始 异或值就为 0 ,那么后手可以始终保持最优策略使得先手 异或为 0先手处于必败态

 

K-Nim游戏:每次只能取k个

 

例子

给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 n。

第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量。

输出格式

如果先手方必胜,则输出 Yes

否则,输出 No

数据范围

1≤n≤10^5,
1≤每堆石子数≤10^9

输入样例:

2
2 3

输出样例:

Yes
import java.io.*;

class Main{
    static int n;
    public static void main(String[] args) throws IOException{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(in.readLine());
        String[] s = in.readLine().split(" ");

        int res = 0;
        for(int i=0;i<n;i++)
            res ^= Integer.parseInt(s[i]);

        if(res==0) System.out.println("No");
        else System.out.println("Yes");
    }
}

 后续会更新更多版本的Nim游戏。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何对比 MySQL 主备数据的一致性?

随着业务范围的扩大&#xff0c;很多企业为了保障核心业务的高可用性&#xff0c;选择了 MySQL 主从架构&#xff0c;这一套方案通常具备主备数据同步、数据备份与恢复、读写分离、高可用切换等特性&#xff0c;是一种相当成熟可靠的数据库架构方案。然而这套方案在特定情况下可…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步&#xff1a;下载log4net。 右键项目引用&#xff0c;进入管理NuGet包。 搜索log4net&#xff0c;下载安装。 第二步&#xff1a;创建LogHelper类。 public class LogHelper { private LogHelp…

Java泛型简介

Java泛型简介 Java泛型是在Java 5中引入的一个特性&#xff0c;它允许程序员在编译时指定类、接口或方法能够接受的类型。泛型的主要目的是提供编译时类型安全检查&#xff0c;避免在运行时因为类型转换错误而导致的ClassCastException。 在没有泛型之前&#xff0c;Java中的集…

Spring08、使用注解开发

8、使用注解开发 8.1、说明 在spring4之后&#xff0c;想要使用注解形式&#xff0c;必须得要引入aop的包 在配置文件当中&#xff0c;还得要引入一个context约束 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

采用广度优先搜索-BFS遍历图

基本思想 1.建立一个队列 2.把初始顶点加入&#xff0c;此后每次取出队首顶点进行访问 3.把从该顶点出发可以到达的&#xff0c;未曾加入过队列的顶点全部加入队列 4.不断取出&#xff0c;直至队列为空结束 遍历实现 1.邻接矩阵实现 const int maxn100; const int INF10000…

六自由度Stewart平台的matlab模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1运动学原理 4.2 Stewart平台运动学方程 5.完整工程文件 1.课题概述 六自由度Stewart平台的matlab模拟与仿真&#xff0c;模拟六自由度Stewart平台的动态变化情况以及伺服角度。 2.系统仿真结果 3.核…

Linux安装Nginx配置Keepalived高可用

Vmwaire 安装 Linux 解决启动没有IP地址问题 cd /etc/sysconfig/network-scripts vi ifcfg-ens33# 重启linux reboot # 再次查看ip ip addrLinux 镜像地址下载 ps: 发现阿里有一个工具箱&#xff0c;里面有各种镜像 阿里镜像地址 https://developer.aliyun.com/mirror/ 安装…

web学习笔记(二十一)

目录 1.构造函数创建对象 1.1规则 1.2 new关键字调用构造函数时&#xff0c;函数内部做了什么事情&#xff1f; 1.3总结 2.混合模式创建对象 3.JavaScript 继承---借助构造函数 4.原型链 4.1原型链实现方法继承 5.完美的组合继承 6.call方法的使用 1.构造函数创建对象…

【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…

一、深度学习介绍

目录 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景 1、深度学习与机器学习的区别 1.1 特征提取方面 1.2 数据量和计算性能要求 1.3 算法代表 2、深度学习应用场景

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

CP AutoSar之LIN Driver详细说明

本文遵循autosar标准&#xff1a;R22-11 1 简介 本文指定了 AUTOSAR 基础软件模块 LIN 驱动程序的功能、API 和配置。 1.1 范围 LIN驱动程序适用于ISO 17987主节点和从节点。AUTOSAR中的LIN实现偏离了本LIN驱动器规范中所述的ISO 17987规范&#xff0c;但LIN总线上的行为不…

搜维尔科技:CATIA为建筑、基础设施和城市规划提供虚拟孪生力量

超越传统项目交付方法限制的协作 复杂建筑和基础设施项目开发的设计和工程流程需要多个利益相关者和所有项目阶段的密切合作。此外&#xff0c;日益复杂的施工项目要求所有团队都依赖 CATIA 和3D EXPERIENCE 虚拟孪生技术作为“通用语言”&#xff0c;以促进协作并减少阶段之间…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

开发前端需求时,我们该如何准确预估个人工时

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习 原文作者&#xff1a;掘金-悟空和大王 前言 分享一篇前端开发人员比较感兴趣的话题&#xff0c;如何评估工时。 领导为什么会压工时&#xff1f; 使他的KPI更好看不清楚做这个东西实际要多长时间因为第2点的原因&…

极狐GitLab 使用指南:开启多种导入导出源

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 极狐GitLab 支持从主流的平台将项目导入到极狐GitLab&#xff…

Qt|QTreewidget类下函数qt助手详解说明示例(上)

该系列持续更新&#xff0c;喜欢请一键三连&#xff0c;感谢各位大佬。 QT5.14.2 参考官方QT助手 文章目录 QTreeWidget ClasspropertiesPublic Functions默认构造函数默认析构函数添加根节点void addTopLevelItem(QTreeWidgetItem *item)添加多个根节点void addTopLevelItems…

图神经网络实战——图论

图神经网络实战——图论 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图与非加权图1.3 连通图非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前言 图论 (Graph theory) 是数学…

从代码到内容:使用C#和Fizzler探索Instagram的深处

文章摘要&#xff1a; Instagram是一个流行的社交媒体平台&#xff0c;拥有数亿的用户和海量的图片和视频内容。如果您想要从Instagram上获取一些有用的信息或数据&#xff0c;您可能需要使用爬虫技术来自动化地抓取和分析网页内容。本文将介绍如何使用C#和Fizzler这两个强大的…