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

本文共 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

你可能感兴趣的文章
[LeetCode] Path Sum IV 二叉树的路径和之四
查看>>
oracle定时任务
查看>>
Cocos Creator 计时器的延时循环试用方法
查看>>
HAProxy+Redis实现负载负载均衡(待实践)
查看>>
JSON 数据格式
查看>>
Python 列表 index() 方法
查看>>
MySQL常用的七种表类型(转)
查看>>
django之跨表查询及添加记录
查看>>
Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
查看>>
Linux/Android——Input系统之InputMapper 处理 (八)【转】
查看>>
006——数组(六)array_fill()array_filter()array_flip()array_key_exists()array_keys()
查看>>
PowerDesigner使用积累
查看>>
收了几个有背景的学生。
查看>>
洛谷P3954 成绩【民间数据】
查看>>
spring rest 容易被忽视的后端服务 chunked 性能问题
查看>>
鼠标滑过弹出层
查看>>
Difference Between Session.run and Tensor.eval
查看>>
MHA高可用架构与Atlas读写分离
查看>>
ucloud mysql
查看>>
linux系统编程:获取glibc的版本号
查看>>