首先是阶梯博弈 转载一下
https://www.cnblogs.com/Chierush/p/3240251.html
如这就是一个阶梯博弈的初始状态 2 1 3 2 4 … 只能把后面的点往前面放…如何来分析这个问题呢…其实阶梯博弈经过转换 可以变为Nim… 把所有奇数阶梯看成N堆石子…做nim…把石子从奇数堆移动到偶数堆可以理解为拿走石子…就相当于几个奇数堆的石子在做Nim…( 如所给样例…234=5 不为零所以先手必败)为什么可以这样来转化?
假设我们是先手…所给的阶梯石子状态的奇数堆做Nim先手能必胜…我就按照能赢的步骤将奇数堆的石子移动到偶数堆…如果对手也是移动奇数堆…我们继续移动奇数堆…如果对手将偶数堆的石子移动到了奇数堆…那么我们紧接着将对手所移动的这么多石子从那个偶数堆移动到下面的奇数堆…两次操作后…相当于偶数堆的石子向下移动了几个…而奇数堆依然是原来的样子…即为必胜的状态…就算后手一直在移动偶数堆的石子到奇数堆…我们就一直跟着他将石子继续往下移…保持奇数堆不变…如此做下去…我可以跟着后手把偶数堆的石子移动到0…然后你就不能移动这些石子了… 所以整个过程…将偶数堆移动到奇数堆不会影响奇数堆做Nim博弈的过程…整个过程可以抽象为奇数堆的Nim博弈…
其他的情况…先手必输的…类似推理…只要判断奇数堆做Nim博弈的情况即可…
为什么是只对奇数堆做Nim就可以…而不是 偶数堆 呢?…因为如果是对偶数堆做Nim…对手移动奇数堆的石子到偶数堆…我们跟着移动这些石子到下一个奇数堆…那么最后是对手把这些石子移动到了0…我们不能继续跟着移动…就只能去 破坏原有的Nim而导致胜负关系的不确定 …所以 只要对奇数堆做Nim 判断即可知道胜负情况…
然后是这题里的状态转移,可以得出有以下几种转移的方式
1,2,7,8,13,14…
3,6,9,12,15…
4,5,10,11,16,17…
当然有许多可以有多种转移的方式(比如11可以转移到10,也可以直接转移到4)
发现其特征是i%6=0,2,5的盒子可以转移到i%6=1,3,4的盒子上,而最终的转移到1,3,4盒子上时就转移不了了。所以奇数步转移的是余数是2,,5,6的情况,偶数步转移的是,1,3,4的情况。于是这里的偶数,奇数的含义就出来了。偶数奇数是指转移到不能再转移的点的步数,而不仅仅是标号,比如这里的1,3,4是不能再转移的点,而上面图中0是不能转移的点,所以1,3,5才会是奇数,2,4才会是偶数。
然而还要注意一点。在图中,也就是阶梯博弈中,只能从i转移到i-1,也就是只能有一种从奇数到偶数,或者偶数到奇数的方法,但是这里有多种,比如11到10,11到4。其实是不会影响的。
以0,1,2,3,4,5为例,假如5可以直接到0,对于先手必胜的情况,我只要按照NIM的规则移动相应的数就行了,反正每个奇数堆都能往外移,也就是可以保证到NIM的移动,至于移动到哪里是不用考虑的,最后后手还是碰到一个必败态。后手若是移动偶数号到奇数号,则先手把后手刚刚移动的再从奇数号都偶数号。也不用考虑移动到哪里。对于先手必败的情况,移动偶数号的,后手可以移动奇数号,奇数号的,反正是必败态,移动多少也是输,也不用考虑移动到哪里。所以和能够移动的位置是无关的,只要保证该点i能够经奇数步达到1,3,4就可以了,比如11->10->5->4 3步,奇数步 11->4 奇数步。于是,可以对上面的阶梯博弈延申一下,奇数步的盒子不管什么移动的方法,只要最终达到0号阶梯的步数是奇数就可以了
所以对奇数号的值进行异或就可以了。
最后再贴一下别人的一些证明:
https://blog.csdn.net/weixin_43846139/article/details/99542688?ops_request_misc=&request_id=&biz_id=102&utm_term=hdu3389&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-8-.nonecase&spm=1018.2226.3001.4187
思路:
设n=a+b,则当n为3,9,15,21………的时候满足条件,即n为%6=3的数
则有
((n%6=1)+(n%6=2))%6=(n%6=3)
((n%6=4)+(n%6=5))%6=(n%6=3)
((n%6=3)+(n%6=0))%6=(n%6=3)
说明可以从(n%6=2)->(n%6=1)传递卡片
同理(n%6=5)->(n%6=4),(n%6=0)->(n%6=3)
且1,3,4为这三种情况的终态,即不能转移到其他状态,其他每个状态皆可转移,如 2->1 , 5->4,6->3,7->2,8->1,9->6……
我们可以它分成一个二分图,
如果可以从A拿卡片到B,连一条从A到B的边。把编号满足(x%6=1||x%6=3||x%6=4)的放在左边,其他的放在右边。不难发现
1)只有从左边到右边的边或从右到左的边。
2)从左边到终态的步数都是偶数步,右边到终态的步数都是奇数步
则有,所有卡片都在偶数步盒子中是必败状态。
因为不论先手将偶数步的盒子中的卡片移走了多少,后手一定可以把这些卡片再往前移动一个盒子,直到移到1 3 4中去为止。
对于只有一个盒子有卡片,而且这个盒子是奇数步盒子来说,先手必胜。
很简单,根据上面的结论,只要先手把这个奇数步盒子中所有卡片全部往下移一个盒子就好了。这样就转移到了先手必败状态。
整个游戏可以看做若干个子游戏的和游戏,偶数步盒子不予考虑,只考虑奇数步盒子中的卡片,这就相当于一个n堆石子的Nim游戏。
在一个奇数步盒子中移走k张卡片,相当于在某一堆石子中取走k个石子。把所有石子取完相当于,所有的卡片都在偶数步的盒子里面,而我们已经证明完这种状态是必败状态了。
所以在代码中就只需要将奇数步盒子中的卡片数异或一下求个Nim和,就能判断胜负了。