1、翻硬币游戏 一般的翻硬币游戏的规则是这样的:N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按 1 到 N 编号。第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,最右边那个硬币的必须是从正面翻到反面。例如,只能翻 3 个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。第二,谁不能翻谁输。有这样的结论:局面的 SG 值为局面中每个正面朝上的棋子单一存在时的 SG 值的异或和。即一个有 k 个硬币朝上,朝上硬币位置分布在的翻硬币游戏中,SG 值是等于 k 个独立的开始时只有一个硬币朝上的翻硬币游戏的 SG 值异或和。比如
2、THHTTH 这个游戏中,2 号、3 号、6 号位是朝上的,它等价于 TH、TTH、TTTTTH 三个游戏和,即 sgTHHTTH=sgTHsgTTHsgTTTTTH.我们的重点就可以放在单个硬币朝上时的 SG 值的求法。约束条件一:每次只能翻一个硬币。一般规则中,所翻硬币的最右边必须是从正面翻到反面,因为这题是只能翻一个硬币,那么这个硬币就是最右边的硬币,所以,每次操作是挑选一个正面的硬币翻成背面。对于任意一个正面的硬币,SG 值为 1。有奇数个正面硬币,局面的 SG 值=1,先手必胜,有偶数个正面硬币,局面的 SG 值=0,先手必败。约束条件二:每次能翻转一个或两个硬币。(不用连续)每个硬
3、币的 SG 值为它的编号,初始编号为 0,与 NIM 游戏是一样的。如果对于一个局面,把正面硬币的 SG 值异或起来不等于 0,既 a1a2a3an=x,对于 an 来说一定有 an=anxan。如果 an=0,意思就是说,把 an 这个值从式子中去掉就可以了。对应游戏,就是把编号为 an 的正面硬币翻成背面就可以了。因为 anx=0,而 a1a2a3an=x,即ana1a2a3an=0,即 a1a2a3an-1=0,只要在原来的 x 里面去掉 an 就可以了。如果 an!=0,意思就是说,把 an 这个值从式子中去掉后再在式子中加上 an,anan。对应游戏,去掉 an 就是把编号为 an
4、的正面硬币翻成背面,加上 an,如果编号为 an的硬币是正面,我们就把它翻成背面,是背面就翻成正面,总之,就是翻转编号为 an的硬币。因为 anx!=0,所以 ana1a2a3an!=0,即 a1a2a3an-1!=0,而这里的an=a1a2a3an-1,所以在 x 中去掉 an 后,要对 an进行异或,也就是翻转,正转反,反转正。约束条件三:每次必须连续翻转 k 个硬币。我们以 k=3 为例。我们计算的是个数为 N 的硬币中,其中最后一个硬币为正面朝上,的 sg 值。当 N=1 时,硬币为:正,先手必输,所以 sg1=0。当 N=2 时,硬币为:反正,先手必输,所以 sg2=0。当 N=3
5、时,硬币为:反反正,先手必胜,所以 sg3=1。当 N=4 时,硬币为:反反反正,先手操作后为:反正正反,子状态局面的 SG=01=1,那么 sg4=0。当 N=5 时,硬币为:反反反反正,先手操作后为:反反正正反,子状态局面的SG=10=1,那么 sg5=0。当 N=6 时,硬币为:反反反反反正,先手操作后为:反反反正正反,子状态局面的SG=00=0,那么 sg6=1。根据观察,可以知道,从编号为 1 开始,sg 值为:001 001 001 001根据观察,可以知道,sg 的形式为 00001 00001,其中一小段 0 的个数为 k-1。约束条件 4:每次翻动一个硬币后,必须翻动其左侧最
6、近三个硬币中的一个,即翻动第 x个硬币后,必须选择 x-1,x-2,x-3 中的其中一个硬币进行翻动,除非 x 是小于等于 3 的。(Subtraction Games)当 N=1 时,硬币为:正,先手必赢,所以 sg1=1。当 N=2 时,硬币为:反正,先手必赢,因为先手可以翻成反反或正反,可能性为 2,所以 sg2=2。当 N=3 时,硬币为:反反正,先手操作后可以为:反正位置 x:1 2 3 4 5 6 7 8 9 10 11 12 13 14.sgx: 1 2 3 0 1 2 3 0 1 2 3 0 1 2这个与每次最多只能取 3 个石子的取石子游戏的 SG 分布一样,同样还有相似的这
7、类游戏,约束条件 5 也是一样。约束条件 5:每次必须翻动两个硬币,而且这两个硬币的距离要在可行集 S=1,2,3中,硬币序号从 0 开始。(Twins 游戏 )当 N=1 时,硬币为:正,先手必输,所以 sg0=0。当 N=2 时,硬币为:反正,先手必赢,所以 sg1=1。当 N=3 时,硬币为:反反正,先手必赢,所以 sg2=2。当 N=4 时,硬币为:反反反正,先手必赢,所以 sg3=3。当 N=5 时,硬币为:反反反反正,先手必输,所以 sg4=0。位置 x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14.sgx: 0 1 2 3 0 1 2 3 0 1 2 3
8、0 1 2约束条件 6:每次可以翻动一个、二个或三个硬币。(Mock Turtles 游戏)初始编号从 0 开始。当 N=1 时,硬币为:正,先手必胜,所以 sg0=1.当 N=2 时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为 2,所以 sg1=2。当 N=3 时,硬币为:反反正,先手必赢,先手操作后可能为:反反反、反正反、正反正、正正反,方案数为 4,所以 sg2=4。位置 x:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14.sgx: 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28看上去 sg 值为 2x 或者 2x
9、+1。我们称一个非负整数为 odious,当且仅当该数的二进制形式的 1 出现的次数是奇数,否则称作 evil。所以 1,2,4,7 是 odious 因为它们的二进制形式是 1,10,100,111.而 0,3,5,6 是 evil,因为它们的二进制形式是 0,11,101,110。而上面那个表中,貌似 sg 值都是 odious 数。所以当 2x 为 odious 时,sg 值是 2x,当 2x 是 evil 时,sg 值是2x+1.这样怎么证明呢?我们会发现发现,evilevil=odiousodious=evilevilodious=odiousevil=odious假设刚才的假说是成
10、立的,我们想证明下一个 sg 值为下一个 odious 数。注意到我们总能够在第 x 位置翻转硬币到达 sg 为 0 的情况;通过翻转第 x 位置的硬币和两个其它硬币,我们可以移动到所有较小的 evil 数,因为每个非零的 evil 数都可以由两个 odious 数异或得到;但是我们不能移动到下一个 odious 数,因为任何两个 odious 数的异或都是 evil 数。假设在一个 Mock Turtles 游戏中的首正硬币位置 x1,x2,xn 是个 P 局面,即 sgx1sgxn=0.那么无可置疑的是 n 必定是偶数,因为奇数个 odious 数的异或是 odious 数,不可能等于 0
11、。而由上面可知 sgx是 2x 或者 2x+1,sgx 又是偶数个,那么x1x2xn=0。相反,如果 x1x2xn=0 且 n 是偶数,那么 sgx1sgxn=0。这个如果不太理解的话,我们可以先这么看下。2x 在二进制当中相当于把 x 全部左移一位,然后补零,比如说 2 的二进制是 10,那么 4 的二进制就是 100。而 2x+1 在二进制当中相当于把 x 全部左移一位,然后补 1,比如说 2 的二进制是 10,5 的二进制是 101。现在看下sgx1sgxn=0,因为 sgx是 2x 或者 2x+1,所以式子中的 2x+1 必须是偶数个(因为2x 的最后一位都是 0,2x+1 的最后一位
12、都是 1,要最后异或为 0,2x+1 必须出现偶数次)。实际上的情况可能是这样的:MT 游戏当中的 P 局面是拥有偶数堆石子的 Nim 游戏的 P 局面。约束条件 7:每次可以连续翻动任意个硬币,至少翻一个。(Ruler 游戏)初始编号从 1 开始。那么这个游戏的 SG 函数是 g(n)=mex0,g(n-1),g(n-1)g(n-2),g(n-1)g(1)根据 SG 函数可以得到 SG 值表如下。位置 x:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16.g(x): 1 2 1 4 1 2 1 8 1 2 1 4 1 2 1 16所以 sg 值为 x 的因数当中
13、2 的能达到的最大次幂。比如 14=2*7,最大 1 次幂,即2;16=2*2*2*2,最大 4 次幂,即 16。这个游戏成为尺子游戏是因为 SG 函数很像尺子上的刻度。约束条件 8:每次必须翻转 4 个对称的硬币,最左与最右的硬币都必须是从正翻到反。(开始的时候两端都是正面)(Grunt 游戏)这是 Grundy 游戏的变种,初始编号从 0 开始。当首正硬币位置为 0,1,2 时是 terminal 局面,即 终结局面,sg 值都是 0。当首正硬币位置n 大于等于 3 的时候的局面可以通过翻 0,x,n-x,n 四个位置得到( 其中 xn/2 可保证胜利) 。这就像是把一堆石子分成两堆不同大小石子的游戏,也就是 Grundy 游戏。