描述:

尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限。取走最后石子的人获胜。

标准解法:

判断:

先计算先手是必胜还是必败:

将每堆石子的数量做二进制异或(即用二进制表示,每个数字的第一位做异或;第二位做异或...),结果如果是0,则必败;否则必胜。

(其实每个二进制位如果有偶数位1,则异或结果是0,否则为1;异或符合结合律,交换律)

做法:

如果是必胜局如何操作:

必胜局则异或结果不是0,操作某一堆,使得异或结果是0。

证明:

这其实是ICG游戏的标准解法。找到P态和N态(也称奇异非奇异局势,平衡态、终态等):

P态:必败态,P态的任一操作都将使局面转为N态;

N态:必胜态,N态可以一步转为P态;

其实不用管上面的理论也行,只有证明以下结论即可:

1.对于一个异或和为0的局面,任一操作都将使其不为0;

2.对于一个异或和不为0的局面,存在一个操作使其为0;

对于1:由于只能操作一个数,至少减一,则有:

      如果改变后的数的二进制表示中,1对应的位完全和原来一样,则必定有0改为了1,导致改变后的数大于原数,矛盾。

      所以,改变后的数二进制中,至少有1个1变成了0,则改位的异或和改为了1,证毕。

对于2:可以通过改变1的奇偶来改变异或和(可以通过删除1或增加1):

      设从高到低,含有奇数列的序号位w1, w2 ,w3...

      任意选取最高列中,1所在的数。删除这个1,实际是分配w1 - 1个1给这个数后面的任一列。

      则这行中,多出的1删去,少了的补上即可。

      如:     

        5:  0 1 0 1
        10:1 0 1 0
        1:  0 0 0 1
        4:  0 1 0 0

      其中奇数号列位4,2,而第四列中,10的最高位的1可删除,删去1(实际是删去8),

      后面可任意改变数量,而第二列中也多出1,删去。得0。即10全部取走。

由于0,0,0是异或和为0的状态,只要一直将异或为0的状态交给对方,由于数量一直减少,则自己总能到达0,0,0态,取得胜利。

ICG游戏:尼姆游戏异或解法的证明的更多相关文章

  1. 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)

    最近闲来无事刷LeetCode,发现这道题的Accept Rate还是挺高的,尝试着做了一下,结果悲剧了,把过程写下来,希望能长点记性.该题的描述翻译成中文如下: 你正在和你的朋友玩尼姆游戏(Nim ...

  2. 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)

    最近闲来无事刷LeetCode,发现这道题的Accept Rate还是挺高的,尝试着做了一下,结果悲剧了,把过程写下来,希望能长点记性.该题的描述翻译成中文如下: 你正在和你的朋友玩尼姆游戏(Nim ...

  3. HDU 2176 取(m堆)石子游戏 尼姆博弈

    题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...

  4. [LeetCode] Nim Game 尼姆游戏

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...

  5. leetCode之旅(5)-博弈论中极为经典的尼姆游戏

    题目介绍 You are playing the following Nim Game with your friend: There is a heap of stones on the table ...

  6. BZOJ1022[SHOI2008]小约翰的游戏——anti-SG(反尼姆博弈)

    题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到 ...

  7. POJ 2234 Matches Game (尼姆博弈)

    题目链接: https://cn.vjudge.net/problem/POJ-2234 题目描述: Here is a simple game. In this game, there are se ...

  8. Nim游戏(尼姆博弈)

    这里是尼姆博弈的模板,前面的博弈问题的博客里也有,这里单列出来. 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆中取若干个,可将一堆全取走,但不可不取,拿到最后1颗石子的人获胜.假设A B都非 ...

  9. 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)

    博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...

随机推荐

  1. memcache+tomcat7.0.37+nginx实现session共享

    一.session工作原理 由于http是无状态的协议,当我们访问了页面A,然后访问页面B,http无法确定这2个页面的访问是来自同一个人.因此,我们要用cookie或session来跟踪用户,根据授 ...

  2. js设计模式整理

    单例模式 恶汉式单例 实例化时 懒汉式单例 调用时构造函数模式 1.实现一 function Car(model, year, miles) { this.model = model; this.ye ...

  3. 6.4-6.5 使用form表单验证,完善登录页面

    之前是使用自定义的类来实现登录逻辑,现在使用django内置的form表单验证,用继承django的view来实现登录页面. users > views.py 的内容是: from django ...

  4. python api接口认证脚本

    import requests import sys def acces_api_with_cookie(url_login, USERNAME, PASSWORD, url_access):     ...

  5. fusionjs uber开源的通用web插件化开发框架

    fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ...

  6. Jenkins在windows环境下安装无法安装插件

    在windos平台下安装jenkins要是无法安装插件,tomcat控制台报以下错误: 解决方法: 进入到jenkins里头,Jenkins -- 管理插件 -- 高级 -- 升级站点,如图所示: 将 ...

  7. FastAdmin 的前端环境怎么安装?

    FastAdmin 的前端环境怎么安装? 安装 Git 安装 Node.js 安装 cnpm 安装 bower 开始安装 FastAdmin 的前端组件 bower install bower upd ...

  8. Angular 安装

    1.angular安装 npm  install -g angular 2. 显示angular安装路径 npm config ls 3. angular 双向绑定 <!DOCTYPE html ...

  9. 管道和FIFO 二

    前面我们学习了一下进程,我们知道多,进程间的地址空间相对独立.进程与进程间不能像线程间通过全局变量通信. 如果想进程间通信,就需要其他机制.          常用的进程间通信方式有这几种   A.传 ...

  10. PHP常用获取文件路径的函数集合整理

    转自: http://blog.sina.com.cn/s/blog_71ed1b870102vslg.html 我们在开发PHP项目过程中,经常会用到包含文件,所以有时候需要获取文件的相对路径或者绝 ...