博弈论之Nim游戏

       OI里,博弈论就是两个聪明绝顶的人玩不公平的游戏。

        Nim游戏是组合游戏(Combinatorial Games)的一种,属于“Impartial Combinatorial Games”(以下简称ICG)。

        通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

        我们都知道,对于N堆石子,判断第一个人是否赢是将每个石子进行异或运算,如果结果为0则第一个人取得必输,否则必赢。

        但主要是为什么用异或?为什么等于零则是先者必输?

        首先先说一下大家都知道的定义吧:P-position和N-position。

        P-position:P即Previous,该局面为P-position,则代表着这个局面先行者必输,后行者必赢。

        N-position:N即Next,该局面为N-position,则代表着这个局面的后行者必输,先行者必赢。

        很显然,对于无法移动的局面(Terminal position)为P-position;可以移动到P-position局面的必为N-position局面(就是这个局面是先行者必输的话,它的上一个局面一定是后行者必输);所有移动都导致N-position局面的是P-position。

        也就是说,对于一个局面A是 P-position还是N-position,如果它的子局面(所谓子局面就是这个局面的能够发展成的后续局面,比如两个石子堆个数为(3,3),那么它的子局面为(0,3)(1,3)(2,3))存在先者必输P-position的局面,那么局面A就是后者必输N-position的局面,如果它的子局面全部是后者必输N-position的局面,那么局面A就是先者必输P-position的局面(子局面的后者就是局面A的操作者)。

        为此我们要判断的就是一开始是属于什么局面,根据上述定义可知这个局面的判定取决于它的子局面,而它的子局面又取决于它的子子局面……直到这个局面能够独立判断是P-position还是N-position,然后再回溯判断,对于这个递归的算法你可能已经敏锐地看到有大量重复的子问题了,需要记忆化搜索或DP,这实际上也就是博弈论的本质而已,只是我们存在一种比搜索更优的方法——异或。

        为什么用异或呢?因为异或有一种我们需要的神奇的性质——消去律。

       1.对于Terminal position只有一个,也就是全为0,结果也为0,故先行者必输。

       2.某个局面(a1,a2,...,an),若a1^a2^......^an=k(k不等于0),则必有一种局面ai能够通过合法的步骤转换为ai',使结果变为0(k二进制中的某一位中的1必定是某个ai贡献过来的),其中ai^k=ai'<ai(ai在k的二进制下最高位是1),所以是后行者必输。

      3.某个局面(a1,a2,...,an),若a1^a2^......^an=0,若ai能够通过合法的步骤转换成另一个局面ai'使结果也为0,那么a1^a2^..^ai^...^an=a1^a2^..^ai'^...^an,根据消去律,得到ai=ai',这是不合法的移动(因为还是它本身),所以是先行者必输。

      而这样,我们就可以在O(n)内知道应该是先行还是后行了。

      关于SG函数,我们先定义一种作用在集合的运算mex,定义结果为该集合中未出现最小非负整数,如mex{0,1,2,4}=3、 mex{2,3,5}=0、mex{}=0。

      对于一个给定的有向无环图,定义关于图的每个顶点的Sprague-Garundy函数g如下:g(x)=mex{ g(y) | y是x的后继(就是子局面) }。

      实际上,所以Nim游戏都可以抽象成一个模型:一个有向图中,一个棋子代表着当前局面,每个顶点代表着每个局面,而每位选手则负责移动棋子,直到某个选手无法移动棋子则为负。

     所以对于SG函数的性质,跟上面所讲的1,2,3是一样的:

      1.对于Terminal position对应的顶点,就是没有出边,其g(x)=0;

      2.若该点ai的g(ai)不为0,则它的后继里存在一个顶点ai'它的g(ai')=0;

      3.若该点ai的g(ai)=0;则它的后继里没有一个顶点ai'它的g(ai')=0。

      事实上,如果有多堆石子,我们可以把每堆石子都抽象成一个棋子在图中移动,那么我们所要做的就是讲每个棋子所在顶点的SG值算出来,异或一下即可。

      稍微变一下,有n堆石子,每次可以从第1堆石子里取1颗、2颗或3颗,可以从第2堆石子里取奇数颗,可以从第3堆及以后石子里取任意颗, 我们可以把它看作3个子游戏,第1个子游戏只有一堆x颗石子,每次可以取1、2、3颗,很容易看出x颗石子的局面的SG值是x%4(数学归纳法可以证明)。第2个子游戏也是只有一堆 石子,每次可以取奇数颗,经过简单的画图可以知道这个游戏有x颗石子时的SG值是x%2。第3个游戏有n-2堆石子,就是一个Nim游戏。对于原游戏的每 个局面,把三个子游戏的SG值异或一下就得到了整个游戏的SG值,然后就可以根据这个SG值判断是否有必胜策略以及做出决策了。

     g(x)=b,说明当前局面可以移动到g(a)=b-1,b-2,b-3.......1,0上。

      所以,对于我们来说,我们是将一个复杂的游戏分成许许多多若干个简单的小游戏,再分别求出SG值,再全部异或起来就是原游戏的SG值了。

      关于题目所说的完美操作,双方足够聪明,指的就是当前这个局面如果能够赢得这场游戏的话,这个人就会顺着这个能够赢的这条路径进行下去,就是N-position。

转载于:https://www.cnblogs.com/Lanly/p/7262998.html

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

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

相关文章

python标准库sys_Python标准库之Sys模块使用详解

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sys模块获得脚本的参数 复制代码代码如下: print "script name is", sys.argv[0] …

python3.7知识点汇总

Python3.7从零开始学 —|进入Python3.7的精彩世界 —|---|Python起源 —|---|—|Python作者简介 —|---|—|---|Guido von Rossum&#xff0c;荷兰人。1982年&#xff0c;Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。1989年&#xff0c;他创立了Python语言。 —|---|—|…

块编码、对象编码、小波编码、分布式编码【转贴】

人类获取的信息中70%来自于视觉&#xff0c;视频信息在多媒体信息中占有重要地位&#xff1b;同时视频数据冗余度最大&#xff0c;经压缩处理后的视频质量高低是决定多媒体服务质量的关键因素。因此数字视频技术是多媒体应用的核心技术&#xff0c;对视频编码的研究已成为信息技…

cookie练习

cookie是网站便于辨别用户身份&#xff0c;进行 session 跟踪而储存在用户本地终端上的数据。 cookie通过jsdom操作完成。 添加cookie&#xff1a; document.cookie ‘name val’;前一个是name&#xff0c;后一个是val。添加的时间是永久的。 document.cookie ‘name val ;…

算法学习系列(十):用数组模拟链表、双链表、栈、队列、单调栈、单调队列

目录 引言一、数组模拟链表1.模板2.例题3.测试 二、数组模拟双链表1.模板2.例题3.测试 三、数组模拟栈1.模板2.例题3.测试 四、数组模拟队列1.模板2.例题3.测试 五、数组模拟单调栈1.例题模板2.测试 六、数组模拟单调队列1.例题模板2.测试 引言 首先说一下为什么要拿数组来模拟…

为什么你的路由器穿墙能力差?看完秒懂

1、信号弱赖我咯? 不管你承认与否&#xff0c;只要有墙家中就会存有信号死角&#xff0c;不要小看一墙之隔。如何让路由器的信号增强? 网上一搜旁门左道真不少&#xff0c;什么调整天线寻找合理角度&#xff0c;又或是用易拉罐DIY一个信号放大器&#xff0c;然鹅并非简单的将…

fish工具_Python程序员使用哪些开发工具

Python程序员使用哪些开发工具?很多Python学习者想必都会有如下感悟&#xff1a;最开始学习Python的时候&#xff0c;因为没有去探索好用的工具&#xff0c;吃了很多苦头。后来工作中深刻体会到&#xff0c;合理使用开发的工具的便利和高效。今天&#xff0c;北京学佳澳小编总…

[shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证

本文地址&#xff1a;http://blog.csdn.net/sushengmiyan/article/details/39933993shiro官网: http://shiro.apache.org/shiro中文手冊&#xff1a;http://wenku.baidu.com/link?urlZnnwOHFP20LTyX5ILKpd_P94hICe9Ga154KLj_3cCDXpJWhw5Evxt7sfr0B5QSZYXOKqG_FtHeD-RwQvI5ozyT…

Web安全之Cookie劫持

1.Cookie是什么? 2.窃取的原理是什么? 3.系统如何防Cookie劫持呢? 看完这三个回答&#xff0c;你就明白哪位传奇大侠是如何成功的!!! Cookie: HTTP天然是无状态的协议&#xff0c;为了维持和跟踪用户的状态&#xff0c;引入了Cookie和Session。Cookie包含了浏览器客户端的用…

python中关于深拷贝和浅拷贝的详解

python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可以 import copy 新的对象 copy.deepcopy(被拷贝对象) 解释 深拷贝是将操作对象整体复制…

运动估计简介

运动估计( Motion Estimation) 维基百科链接&#xff1a;http://en.wikipedia.org/wiki/Motion_estimation运动估计的应用有很多&#xff0c;最初的应用的领域是视频的编码。运动估计算法一般分为: 像素递归法pel-recursive algorithm (PRA)和块匹配法 block-matching algorith…

tutte定理证明hall定理_深入浅出|中心极限定理(Central Limit Theorem)及证明

在介绍统计学中最重要的定理之一-中心极限定理-之前&#xff0c;我们先来想一个问题&#xff1a;统计学的目的是什么&#xff1f;根据<Mathematical statistics with application 7th Edition>书中所写的&#xff1a;统计学的目的是基于从总体中的样本所获得的信息&#…

让数据中心变得更加友好

通常来说&#xff0c;数据中心是一个安全防护十分严密的地方&#xff0c;其安全功能的设计旨在阻止不速之客的访问。但专家认为数据中心可以变得更加友好&#xff0c;因为数据中心需要在人类社会中发挥更大的作用。 数据中心的整体概念是一种可以通过云计算或其他方法进行远程访…

traceroute/tracert--获取网络路由路径

traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关&#xff0c;然后监听一个来自网关ICMP的应答。发送数据包的大小默认为 38个字节。 通过traceroute我们可以知…

使用Cygwin实现vlc 1.0.5的wince移植

本文完全参照了天将降的博客文章&#xff0c;写于此以作来日备忘之用&#xff0c;原文地址&#xff1a;http://bk6.blog.163.com/blog/static/24498560201051193449196/ 第一步&#xff1a;下载安装Cygwin。笔者建议大家不要安装不完整的版本&#xff0c;以免出现不必要的错误…

andriod studio 运行 无结果_华为物联网操作系统LiteOS内核教程01——IoT-Studio介绍及安装...

1. 物联网一站式开发工具 —— IoT StudioIoT Studio 是支持 LiteOS 嵌入式系统软件开发的工具&#xff0c;提供了代码编辑、编译、烧录 及调试等一站式开发体验&#xff0c;支持 C、C、汇编等多种开发语言&#xff0c;让您快速&#xff0c;高效地进 行物联网开发。2. IoT Stud…

5G通信技术能否终结商用WiFi?

科技创新与体育发展可谓相生相伴&#xff0c;而如今科技在体育领域的应用也越来越广泛。本周的话题关于5G技术与球场&#xff0c;作者为英国体育娱乐营销咨询公司Stadia Solutions的联席首席执行官戈登坎贝尔。在坎贝尔先生看来&#xff0c;球场Wi-Fi赋予了俱乐部对数据的掌控力…

颜色转换

以蓝色为例&#xff0c;#0000FF应该被表示成rgb(0,0,255)。 我们将函数命名为getRGB() &#xff08;可以将字符串视为数组&#xff0c;这个数组的元素为字符&#xff09; function getRGB(color) {var rgb [parseInt(0xcolor.slice(1,3)),parseInt(0xcolor.slice(3,5)),parseI…

wince ./configure

CPPFLAGS"-I/usr/wince/include -D_WIN32_WCE0x0500" LDFLAGS"-L/usr/wince/lib" ./configure--hostarm-mingw32ce 指定软件运行的系统平台&#xff1b;host就是你编译好的程序可以运行的平台--target-osmingw32ce 指定软件面向(target to)的系统平台.这主…

android 按键会触发ontouch吗?_Android实现炫酷的拖拽浮动按钮

IOS的Assistive Touch效果很炫酷&#xff0c;可以任意拖拽&#xff0c;同时点击后会展开菜单栏。然而&#xff0c;这不只是IOS的特权&#xff0c;Android也可以实现。但是由于悬浮窗需要申请权限&#xff0c;所以本文仅在app内实现&#xff0c;可以任意拖拽&#xff0c;并可以响…