浅谈SG函数

写在前面

听说CSDN给米就来了,不过作为一个品质优良的程序员来说,无私奉献是我应该做的,所以博主写的文章基本上不花钱,都是为了以后某天忘记了,自己能看懂才写的。so,我会写的很啰嗦,直到保证忘记的我能够看懂。

对于读者嘛,能看就看吧,我就不管了。

咱们一步一步来。

公平游戏

这里直接给出公平游戏的特征:

  • 两个玩家博弈
  • 对于当前状态来讲,之后先手操作,而与当前操作人是谁无关
  • 游戏一定可以进行完
  • 游戏的结果是有限个

三个概念

先手必胜态:即谁是先手,在保证后续都聪明的情况下(是考点),此局必胜。

先手必败态: 同理,先手必败(在都保证聪明的情况下)

后继状态: 当前状态的下一个状态就是后继状态~~(一开始我就没明白后继状态,以为是后面所有的状态)~~

然后我们来看几个显然的性质

  • 如果是必胜态当且仅当至少一个后继状态是必败态
  • 没有后继状态的一定是毕生态
  • 如果是必败态(特意空着)
  • 一个状态的后继状态都是必胜态,则当前为必败态。

这个《(特意空着)》 是我在写性质的时候突然有了疑问?

显然:一个状态的后继状态都是必胜态,则当前为必败态。
这句话一定是正确的,但是反过来来呢?即:如果当前是必败态,那么后续状态都是必胜态?

oiwiki 的定理三:一个状态是必败状态当且仅当它的所有后继状态均为必胜状态。

我们来思考一下,这是对的吗?

举个例子,两堆石子,各 4 4 4 个,问在都是最优策略的情况下谁会赢?

很显然,有个先手必败的策略就是,无论先手选什么,后手跟着选另一堆相同的数,这样必败,那么这就是先手必败喽

我们再来看定义,如果定理三是正确的,那么对于后继状态来讲,必须都是必胜态,可事实如此吗?

当先手选 2 2 2 的时候时候,后者可以有多种选择,而其中选 2 2 2 是一定会胜利的,但是!其他状态可以保证他毕胜吗,显然不行,手玩就可发现不行。

我们发现:后续状态并不全是必胜状态呀?

那应该如何解释?

其实,无论是先手必胜还是先手必败态,我们都是在双方绝对聪明的情况下考虑的,也就是说:上述的状态之中,只有选 2 2 2 才是后继状态,其他是不可能存在的,因为题目条件是:双方都会采取当前最优策略。

所以,通过这个疑问,我们学到了:必胜和必败成立的前提是,双方采取最优策略,否则不成立

看到这里,不免会抱怨,为什么讨论这个问题,感觉是对的不就行了吗?

因为这个定理三在和后面的异或和联系起来的时候,定理三的等价语言就是:

“当 S G 1 ⊕ S G 2 ⊕ . . . . = 0 SG_1 \oplus SG_2 \oplus....=0 SG1SG2....=0时,改变其中一个 S G SG SG值,不存在 S G 1 SG^1 SG1 满足 S G 1 1 ⊕ S G 2 ⊕ . . . . = 0 SG^1_1 \oplus SG_2 \oplus....=0 SG11SG2....=0 再次成立”

很显然,单单从异或和方面来讲,这是正确的,但是如果你搞不懂定理三,就不明白为什么可以用异或和表示必胜或者必败态

求解当前状态

如果对于一个游戏(就拿刚才取数的游戏来说)我们可以手玩出所有的情况,当前状态向后继状态建边,不难发现这将会是一个DAG。

显然最后的状态一定是必败态,也就是出度为0的点一定是必败态,所以我们可以倒着进行拓扑排序,从而得到每一个点的必胜必败态。

Nim 游戏

在知道公平游戏之后,我们用一个游戏来引出SG函数。

题目大意:给出 n n n 堆数,两个人轮流取数,可以取任意一个堆的任意个,不能取者输。

思路: 通过手玩我们发现,当只有两堆数,并且数量一样的时候,此时先手必败,因为无论先手取多少,后手去一样的,一定先手没法取。

并且,还有一个显然的条件是当所有的数都为0的时候也是必败态,才是他们有个相同的特征就是异或和为0,所以我们猜想会不会异或和为0的都是必败态。

对于任意一种异或和为0的状态,先手取后,异或和一定不为0,我们设为 k k k,对于 k k k 的最高位,一定是该位置有奇数个1,因为我们可以任意取,所以我们想消除这个1,因为当消除一个高位的1后,低数位可以任意取,也就是原先有1000,你总能通过取数,满足之前异或后某些位数上是奇数个1的变成偶数个。

所以我们总能取数,使得最终状态异或和为0,随着数量的减少,最后总会来到只剩下数量相同的两堆数的情况,此时显然是必败态,因此对于任何一个异或和为0的状态,都是必败态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值