博弈小游戏严谨的正确的完整的证明

游戏源码连接:博弈小游戏_abcpony的博客-CSDN博客_博弈小游戏

朋友圈整活↓↓↓

 首先恭喜宇神在一个六堆石子的情况上玩过电脑了!!!↓↓↓

 

虽然还是一个比较简单的情况,算是一种巧合,但是不得不说宇神还是宇神,怎么说还是玩过电脑了!

下面话不多说,直接给出完整证明:

首先这个游戏原型就是牛客上的某一道题,但是题目利用到的博弈方面的知识只是判断能否先手必胜,就算题解也没有给出证明而是说什么显然(听闻大佬说做这种题是靠感觉的),只是给出说通过控制减一异或和为0以及要分个数为奇偶的情况讨论。作为犯有证明强迫症的我,就硬生生把一天给搭进去了,为的就是寻找一个可以解释得通的办法,并且最终还把它实现成一个小游戏。下面给出完整证明。
这是一个博弈游戏,重点在于控制数字总个数为偶数并且各个数字减一之后的异或和为0,这样就能把自己立于不败之地。首先由于减一之后数字的异或和为0(当然已经为0的数字不算的)中至少有一种情况是肯定能看出会赢的,那就是两个1、四个1之类的(其中应该说当前只剩下0堆也是归于这种情况的),两个的话对方取完肯定剩一堆我取完他就没了,四个的话双方各取一个之后就变成两个的情况。接下来就是证明如何保证在{数字个数为偶数并且所有数字减一异或和为0}的情况为什么一定无法维持这样,并且只要当前不是{数字个数为偶数并且所有数字减一异或和为0}的情况就一定能把局势转变成这样,以及通过一个个回合的进行必然能让情况变到0堆,这样一来一去就能保证“阴谋”的实现!(注意下面所说到的第几位的含义都是指二进制值的。)
首先应该分当前数量为奇数和偶数的情况讨论,其中偶数情况比较简单,就先谈偶数。假设偶数个数字(当前所有数字)减一之后的异或和为S且S不等于0,那么记S的最高位为第m位,寻找第m位上为“1”的某个减一之后的数字,记为A,让S与A进行异或,得到另一个数字S'(那么显然S'<A,由于比m高的位上数字S'和A的相同,而第m位上A为“1”,S'为“0”),那么S'即为除了A以外的所有减一之后的数字的异或和,要使得所有数字减一之后的异或和为0,那么就要把A变成S',而这是肯定可以做到的,因为S'<A即可以通过在A上取一定量的石子来使得A->S',那么当前情况就变为{数字个数为偶数并且所有数字减一异或和为0}了。而若是处于{数字个数为偶数并且所有数字减一异或和为0}的情况,假设还能维持这种现状,那么首先取完石子之后不能有合并操作(否则变奇数堆),而又至少要取出某堆上的一个石子,这样就改变了该堆石子的数量,那么记原数量减一之后的数字为B,则原除了B之外的所有减一后的数字异或和必为B,此时要把B变成B',那么S=B异或B'必然不是0了,因此偶数情况可得证。而这种情况其实就是最经典的Nim游戏。
对于奇数情况,首先把所有数字分别减一后求异或和S,然后取一个有S最高位s上为1的某个减一后的数字A,和S异或得到B(明显B<A,并且B的含义就是除了A的所有减一的数字的异或和),再找一个B最高位m上对应为0的减一后的数字C(由于去掉A后偶数个数字(原本奇数个数字,现在去掉A剩下为偶数个)的异或和为B,因此定有至少一个减一后的数字m位上为0),现让B和C两个数字从最低位开始“计算”,在“计算”过程中我们要保证加了之后两个数字之和各个位上“1”的数量奇偶性和没加之前两个数字各个位“1”的数量和奇偶性相同,下面举个例子说明如何通过改变数字B来实现这种效果,1011(数字B)+0111(数字C),个位数当然是改变不了,就1+1->0,原本2个“1”变成0个“1”,依然为偶数可行,进一位遇到下一位B、C两数都有“1”,原为2个“1”(偶数个)现在要变成3个或者1个(奇数个),因此不行,就把B对应位上的“1”变成“0”(即1011->1001),则此位上奇偶性可和求和之前“1”和的奇偶性相同,2->0,再次进位,下一位中B为“0”而C为“1”即总共有1个“1”,加了1个变成2个,那么就要把B此位再加上一个变为3个来维持奇数的性质,接下来再进位把3个变成1个,直到目前为止低位上都是可以保持奇偶性的,现在来到了最高位,注意最高位有个特点,必然是一个为“1”一个为“0”即总共1个(并且“1”肯定是在B上,因为本来在选的时候就有保证的了),因此目前进了一个变2个就只需要把B该位上的“1”去掉即可,依然保持1个,若是最高位的运算中没有来进位,即B不用再改变,而进位最大也就是1了,由此,B“+”C得到的数字即可保证剩下的偶数个数字异或和为0!并且细看这种方法是绝对可行的,首先B若是有改变则必然是比改变前要小的(所以可通过取多点石子来实现变化),首先有“0”变成“1”的情况就会有更高位的“1”变“0”的情况,因为“0”变成“1”肯定就是有进位来,而再加上这个变出来的“1”,此位肯定还是会继续进位,那么这个进位一定会有停止的时候,因为这种情况就是B对应位为“1”且C对应位为“0”的时候,而这种情况如果在B最高位之前没有遇到也肯定会最终在B的最高位上遇到,因此改变之后只可能是变小了,而不改变的当然值不变也不可能增大,因此方法可行,只需要在B对应堆上石子取到只剩下改变后的数字B'然后再把它合并到C对应堆上即可。下面这个解决方法的寻找及证明则是我推了一天的所得。
最后说一说为什么会采取这种减一之后的异或和来控制,首先不减一的话那么偶数情况可能就有点乱了,比如当前某一堆只剩下1个然后要取到变成0那么就变成奇数堆了,好像无法统一讨论,而对于奇数的情况来说也可能出现无法先取石子就应该去合并的情况,比如{1,5,4}时候,三个数字的异或和已经是0,那么对于我的解决方法来说就比较难以判断了,本来要是{2,6,5}的话那还能随便找到2的话就还能取掉一个1来和5和并,现在就必须要让5取掉2来和1合并了,情况变得更加复杂,当然这种是说笑,本来给题解的人也没有给方法(只是说了显然?!偶数还说有据可依,奇数真的能显然吗?)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值