翻硬币游戏
一般的翻硬币游戏的规则是这样的:

N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。

第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,**最右边那个硬币的必须是从正面翻到反面。**例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。

第二,谁不能翻谁输。

有这样的结论:局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG 值的异或和。即一个有k个硬币朝上,朝上硬币位置分布在的翻硬币游戏中,**SG值是等于k个独立的开始时只有一个硬币朝上的翻硬币游戏的SG值异或和。比如THHTTH这个游戏中,2号、3号、6号位是朝上的,它等价于TH、TTH、TTTTTH三个游戏和,即sg[THHTTH]=sg[TH]⨁sg[TTH]⨁sg[TTTTTH].**我们的重点就可以放在单个硬币朝上时的SG值的求法。

约束条件一:每次只能翻一个硬币。

一般规则中,所翻硬币的最右边必须是从正面翻到反面,因为这题是只能翻一个硬币,那么这个硬币就是最右边的硬币,所以,每次操作是挑选一个正面的硬币翻成背面。

对于任意一个正面的硬币,SG值为1。

有奇数个正面硬币,局面的SG值 == 1,先手必胜,有偶数个正面硬币,局面的SG值 == 0,先手必败

约束条件二:每次能翻转一个或两个硬币。(不用连续)

每个硬币的SG值为它的编号,初始编号为1,可以转化为NIM游戏

如果对于一个局面,把正面硬币的SG值异或起来不等于0,既a1 ^ a2 ^ a3 ^ … ^ an == x,

那么玩家必然可以通过翻转一个或两个硬币使得异或和为0
证明:不妨设x的二进制表示中最高一位1在第k位,那么在a1,a2,…,an中,必然有一个数ai,它的第k位是1,且ai’ = ai ^ x<ai,

如果 ai’ == 0,意思就是说,把 ai 这个值从式子中去掉就可以了。对应游戏,就是把编号为ai’的正面硬币翻成背面就可以了。

如果ai’ !=0,意思就是说,把 ai 这个值从式子中去掉后再在式子中加上ai’。对应游戏,去掉ai’就是把编号为ai的正面硬币翻成背面,加上ai’ ,如果编号为ai’ 的硬币是正面,我们就把它翻成背面,是背面就翻成正面,总之,就是翻转编号为ai’ 的硬币。

约束条件三:每次必须连续翻转k个硬币。

可以转化为巴什博弈

我们计算的是个数为N的硬币中,当中最后一个硬币为正面朝上,的sg值。

当N==1时。硬币为:正,先手必输,所以sg[1]=0。

当N==2时,硬币为:反正。先手必输,所以sg[2]=0。

当N==3时,硬币为:反反正,先手必胜。所以sg[3]=1。

当N==4时,硬币为:反反反正。先手操作后为:反正正反,子状态局面的SG=0^1=1,那么sg[4]=0。

当N==5时,硬币为:反反反反正。先手操作后为:反反正正反。子状态局面的SG=1^0=1。那么sg[5]=0。

当N==6时,硬币为:反反反反反正。先手操作后为:反反反正正反。子状态局面的SG=0^0=0。那么sg[6]=1。

依据观察,能够知道:从编号为1开始,sg值为:001 001 001 001……

依据观察,能够知道,sg的形式为000…01 000…01,当中一小段0的个数为k-1。

约束条件4:每次翻动一个硬币后。必须翻动其左侧三个硬币中的一个,即翻动第x个硬币后。必须选择x-1。x-2,x-3中的当中一个硬币进行翻动,除非x是小于等于3的。(Subtraction Games)

还是可以转化为类似巴什博弈的模型

当N == 1时,硬币为:正,先手必赢,所以sg[1]=1。

当N == 2时。硬币为:反正,先手必赢,由于先手能够翻成反反或正反。可能性为2。所以sg[2] == 2。

当N == 3时,硬币为:反反正,先手操作后能够为:反正

位置x:1 2 3 4 5 6 7 8 9 10 11 12 13 14…

sg[x]: 1 2 3 0 1 2 3 0 1 2 3 0 1 2…

这个与每次最多仅仅能取3个石子的取石子游戏的SG分布一样,相同还有相似的这类页游游戏,约束条件5也是一样。

约束条件5:每次必须翻动两个硬币,并且这两个硬币的距离要在可行集S={1,2,3}中。硬币序号从0开始。(Twins游戏)

当N == 1时,硬币为:正,先手必输,所以sg[0]=0。

当N == 2时,硬币为:反正,先手必赢。所以sg[1]=1。

当N == 3时。硬币为:反反正。先手必赢,所以sg[2]=2。

当N == 4时,硬币为:反反反正,先手必赢,所以sg[3]=3。

当N == 5时。硬币为:反反反反正,先手必输,所以sg[4]=0。

位置x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14…

sg[x]: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2…

约束条件6:每次能够翻动一个、二个或三个硬币(Mock Turtles游戏)

初始编号从0开始。

当N==1时。硬币为:正,先手必胜,所以sg[0]=1.

当N==2时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为2,所以sg[1]=2。

当N==3时,硬币为:反反正。先手必赢,先手操作后可能为:反反反、反正反、正反正、正正反。方案数为4。所以sg[2]=4。

位置x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14…

sg[x]: 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28…

看上去sg值为2x或者2x+1。

下面引入一个概念:我们称一个非负整数为odious,当且仅当该数的二进制形式的1出现的次数是奇数,否则称作evil。

所以1,2,4,7是odious,因为它们的二进制形式是1,10,100,111。而0,3,5,6是evil,由于它们的二进制形式是0,11,101,110。

而上面那个表中。貌似sg值都是odious数。所以当2x为odious时,sg值是2x,当2x是evil时。sg值是2x+1.

这样怎么证明呢?我们会发现发现:

​ evil ^ evil = odious ^ odious = evil

​ evil ^ odious = odious ^ evil = odious

如果刚才的假说是成立的,我们想证明下一个sg值为下一个odious数。注意到我们总能够在第x位置翻转硬币到达sg为0的情况;通过翻转第x位置的硬币和两个其他硬币。我们能够移动到全部较小的evil数,由于每一个非零的evil数都能够由两个odious数异或得到。可是我们不能移动到下一个odious数,由于不论什么两个odious数的异或都是evil数。

假设在一个Mock Turtles游戏中的首正硬币位置x1,x2,…,xn是个P局面。即sg[x1]…sg[xn]=0.那么无可置疑的是n必然是偶数,由于奇数个odious数的异或是odious数,不可能等于0。而由上面可知sg[x]是2x或者2x+1,sg[x]又是偶数个,那么x1 ^ x 2 ^ …^ xn = 0。相反,假设x1 ^ x 2 ^ … ^ xn = 0且n是偶数,那么sg[x1] ^ … ^ sg[xn]=0。这个假设不太理解的话,我们能够先这么看下:2x在二进制其中相当于把x所有左移一位,然后补零,比方说2的二进制是10。那么4的二进制就是100。而2x+1在二进制其中相当于把x所有左移一位,然后补1,比方说2的二进制是10,5的二进制是101。如今看下sg[x1] ^ … ^ sg[xn]=0,由于sg[x]是2x或者2x+1。所以式子中的2x+1必须是偶数个(由于2x的最后一位都是0,2x+1的最后一位都是1,要最后异或为0,2x+1必须出现偶数次),所以:MT游戏其中的P局面是拥有偶数堆石子的Nim游戏的P局面。

其实只需要记住MT游戏中每个位置的sg为对应的odious数(2x或2x+1)即可

约束条件7:每次能够连续翻动随意个硬币,至少翻一个。(Ruler游戏)

初始编号从1开始。

那么这个游戏的SG函数是g(n)=mex{0,g(n-1),g(n-1) ^ g(n-2),…,g(n-1) ^ … ^ g(1)}

依据SG函数能够得到SG值表例如下:

位置x:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16…

g(x): 1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 16…

所以sg值为x的因数其中2的能达到的最大次幂。比方14=2 * 7,最大1次幂。即2;16=2 * 2 * 2 * 2。最大4次幂,即16。

这个游戏成为尺子游戏是由于SG函数非常像尺子上的刻度。

约束条件8:每次必须翻转4个对称的硬币,最左与最右的硬币都必须是从正翻到反。(开始的时候两端都是正面)(Grunt游戏)

这是Grundy游戏的变种,初始编号从0开始。

当正硬币位置为0,1,2时是terminal局面,即 终结局面,sg值都是0。当正硬币位置n大于等于3的时候的局面能够通过翻0,x,n-x,n四个位置得到(当中x<n/2可保证胜利)。

这就像是把一堆石子分成两堆不同大小石子的游戏,也就是Grundy页游游戏。
小结:
遇到翻硬币问题,如果找不到现成的模型,可以尝试往现有的模型(如nim游戏、巴什博弈等转化),不行就暴力打表sg函数找规律即可

【博弈论】翻硬币游戏8种模型相关推荐

  1. 浅谈 翻硬币游戏【Nim博弈】

    ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...

  2. HDU-3537 Mock Turtles型翻硬币游戏

    题意:<=10^8不定个硬币,给你n<=100个正面朝上的硬币以及他们所在的位置,可任选1/2/3个硬币反转(不必连续),但要求翻的这1/2/3个硬币中的最右侧的一个是正面朝上的,问先手者 ...

  3. 从翻硬币游戏看敏捷开发

    摘要: 敏捷开发还能这么玩? 本文分享自华为云社区<从翻硬币游戏看敏捷开发>,作者:敏捷的小智. 为了推广敏捷开发的理念,很多敏捷教练都会带领团队做一些敏捷小游戏,今天咱们就来聊聊&quo ...

  4. HDOJ 3537 Daizhenyang's Coin (翻硬币游戏)

    转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 每次可以翻动一个.二个或三个硬币. ...

  5. 翻硬币—两种方法 dfs 贪心

    来源:第四届蓝桥杯省赛C++B组 翻硬币 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情 ...

  6. 一文读懂对抗生成网络的3种模型

    https://www.toutiao.com/i6635851641293636109/ 2018-12-17 14:53:28 基于对抗生成网络技术的在线工具edges2cats, 可以为简笔画涂 ...

  7. 蓝桥杯 - 翻硬币(贪心)

    小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo        ...

  8. 敏捷游戏:从硬币游戏学习Scrum敏捷方法

    在Scrum硬币游戏和the-scrum-penny-game-a-modification中都介绍了这个硬币游戏,我觉得不错,如果游戏者真正参与进来,应该能够体会到较多的敏捷思想.而最近项目组也来了 ...

  9. 蓝桥杯练习系统历届试题 翻硬币

    问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...

  10. 历届试题 核桃的数量(3个数的最小公倍数),翻硬币(贪心),买不到的数目(在范围内暴力,找范围,最小公倍数是上界,最小的数是下界),兰顿蚂蚁(dfs,模拟)

    历届试题 核桃的数量 问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 各组的核桃数量必须相同 各组内必须能 ...

最新文章

  1. linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
  2. CentOS、Ubuntu、Debian三个linux比较异同
  3. object C 数据类型
  4. 【AWSL】之Linux文件系统与日志分析(inode、恢复EXT类型的文件、恢复XFS类型的文件)
  5. 010 使用list和tuple
  6. openjdk-7支持版本_长期支持对OpenJDK意味着什么?
  7. ubuntu install opencv
  8. c++频繁读取数据会丢失_异常堆栈信息丢失?到底是怎么回事?
  9. 系统签名缺少libconscrypt_openjdk_jni.so解决
  10. (转)TortoiseGit(乌龟git)保存用户名密码的方法
  11. python类概念是什么意思_python面向对象是什么意思?面向对象九大概念简介
  12. Atitit 持久化 之道 attilax 艾龙著 1. 第2章 Java对象持久化技术概述 2 1.1. 2.1 直接通过JDBC API来持久化实体域对象 2 1.2. 2.2 ORM简介 2
  13. 【模拟电子技术Analog Electronics Technology 1】——用能带理论理解导体,绝缘体和半导体
  14. QTreeView设置branch图标大小
  15. (内附独家PPT)李岩:CynosDB高可用系统介绍
  16. 公司知识库的搭建步骤
  17. 关于计算机系统的夺命12问,你能坚持到第几问?
  18. 360系统急救箱用在服务器上,360系统急救箱打开失败的处理操作
  19. 斯隆论社会责任:德鲁克日志之四月二十五日
  20. 求任意一个自然数n的立方均可写成n个连续奇数之和。

热门文章

  1. 常见的物联网通信技术有哪些,是怎么分类的?
  2. pdf在线预览功能的两种方法
  3. tomcat日志配置-----自带log(一)
  4. junit5 入门系列教程-14-junit5 重复测试(@RepeatedTest)
  5. linux测试sata硬盘读写速度
  6. iwconfig 安装_iwconfig工具使用
  7. matlab中逻辑符号,matlab 逻辑运算符号
  8. 计量经济学(七)----自相关性Autocorrelation.
  9. 虚拟usb打印机服务器,usb打印机服务器 云盘
  10. mysql数据导出insert_mysql 数据导出