博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[学习笔记]nim游戏
阅读量:4984 次
发布时间:2019-06-12

本文共 896 字,大约阅读时间需要 2 分钟。

普通nim游戏:

n堆石子,每个人每次对着一堆拿若干个。不能拿者判输。

只有两种情况,先手必胜,先手必败。

先手必胜当且仅当:a1^a2^...^an!=0

证明:

设=x(x不为0),选择最高位和x一样的ai,显然有ai^x<ai

 

阶梯型nim游戏

阶梯型nim游戏:高度单调的阶梯。每次只能把a[i]中选择x个,放到a[i-1]中,或者把a[1]中扔掉若干个。问有无先手必胜策略。

等价于对奇数堆做nim游戏。

第一次先手,就把奇数堆按照必胜策略移动。偶数堆不管,当做垃圾桶。

如果后手移动奇数堆到偶数堆,就按照奇数堆必胜策略移动。

反之,就把后手移动过来x的奇数堆再往前移动x个。对于奇数堆的状态不变。早晚会把偶数堆移动完。

所以,等价。

 

反向nim游戏

有 N 堆石子,每次可从一堆石子中拿走任意数量的石子。

两个人轮流拿,谁不能拿谁赢。

上面的必胜和必败都是基于“无法操作者败”这个规则来解释的。

若某组合游戏的胜利条件是“无法操作者胜”的话,必胜态必须满足二者之一:

SG异或和>0且石子数>1的堆数>0

SG异或和=0且石子数>1的堆数=0

 证明。。。

 

Nim-K 游戏

有 N 堆石子,每次可从 K 堆石子中拿走任意数量的石子。

两个人轮流拿,谁不能拿谁输。

证明:

数学归纳法

1.没有石子的时候,一定全部为0

2.如果当前全部为0,最多某一位1的个数变化k个,一定不会全部为0

3.如果当前不全为0,从高位开始往低位找,

  如果某一位1的个数为b,之前已经动过的堆数为c,先用c个动过的堆来调整,让b变成0或者k+1,不够用,就从剩下的b的堆把1删去(大概就是先都往0凑,加上新选择的堆还不行的话,那么一定可以直接凑出k+1,直接用c个原来的堆往k+1凑)

  删去1的堆一定已经取走,所以后面就可以随便0->1或者1->0了,加入那c个。如果能操作k个,那么一定可以随心所欲了。

证毕。

 

小例题:

两人之间的距离就是石子数量。都撞上了以后,谁撤,对面立刻怼上去。

转载于:https://www.cnblogs.com/Miracevin/p/9831078.html

你可能感兴趣的文章
【14】redis
查看>>
蓝桥杯/第四届/猜年龄
查看>>
LeetCode-Letter Combinations of a Phone Number
查看>>
关于ubuntu的图形界面的关闭与开启
查看>>
Java 线程控制
查看>>
模块中的特殊变量
查看>>
谈谈Delph中的类和对象2---类可以理解成一种特殊的数据结构、类型转换
查看>>
egret 新建eui组件后无法读取组件内元素的解决办法
查看>>
firebug中启用控制台访问项目很卡很卡
查看>>
RabbitMQ消息队列(六)-消息任务分发与消息ACK确认机制(.Net Core版)
查看>>
mysql如何修改root用户的密码
查看>>
ASP.net参数传递总结
查看>>
超简单vue轮播组件
查看>>
图形的初级变化使用View
查看>>
Codeforces Round #400 E. The Holmes Children
查看>>
hdu 1759 Matrix Revolution(矩阵转BFS)
查看>>
LintCode-88.最近公共祖先
查看>>
WCF
查看>>
861. Score After Flipping Matrix
查看>>
青蛙的约会(扩展欧几里德)
查看>>