POJ-1024取石子游戏(威佐夫博弈)——求解与数学证明

今天在网上看到这道算法题,很有意思,看了网上的解题思路,很受启发,但感觉没有看到严谨的证明,就结合自己的思路,写一下我的证明过程。


题目是这样的:

Problem Description
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
 
Input
输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000。
 
Output
输出对应也有若干行,每行包含一个数字1或0,如果最后你是胜者,则为1,反之,则为0。
 
Sample Input
2 1
8 4
4 7
 
Sample Output
0
1
0

我的思路:

1.首先,对于游戏开始时的任何一种状态(a,b),我想要证明它要么是必胜态,要么是必输态,不存在不确定状态。但是现在不好证明,我先假设这个结论正确(最后我会证明)。随后,我们的讨论会基于这个假设。

2.有了上述假设,我们得出推论:

推论一:状态(a,b)是必胜态等价于存在一种合法的取石子的方案(△a,△b),使得(a-△a,b-△b)为必输态。

(因为(a-△a,b-△b)只可能是必胜态或必输态之一,若它为必胜态则与(a,b)是必胜态矛盾,所以它是必输态)

3.于是,显然又有推论:

推论二:状态(a,b)是必输态等价于不存在合法的取石子的方案(△a,△b),使得(a-△a,b-△b)为必输态。


接下来,证明以下结论:

结论一:对于任意非负整数a,必存在非负整数b,使得(a,b)为必输态,且这样的b只有一个

证:(第二数学归纳法)易知该结论对0成立:(0,0)是必输态,任意满足k>0的(0,k)都是必胜态。

假设结论一对0,……,a-1成立,而对a不成立,即对任意b,(a,b)为必胜态。那么存在取石子的方案(△a,△b)使得(a-△a,b-△b)为必输态,则a>0,否则(a,b-△b)是必输态,与假设矛盾。那么a-△a<a,一定属于{0,1,......,a-1}。我们知道a-△a满足结论一,即存在唯一的b',使得(a-△a,b')为必输态。而对于{0,1,......,a-1}中的每一个数都是这样,所以这a个数最多能对应a个必输态。接下来注意△a△b的关系:要么△a=△b要么△b=0。所以得到必输态(a-△a,b')的要么是(a,b'+△a)要么是(a,b')。那么a种必输态最多对应2a种必胜态。而我们假设:对任意b(a,b)为必胜态。所以产生矛盾。所以对于任意非负整数a,必存在非负整数b,使得(a,b)为必输态得证。

再证明b的唯一性,若存在b1≠b2,使得(a,b1)和(a,b2)都是必输态,不妨设b1<b2,则有方案(b2-b1,0)使(a,b2)转移到(a,b1),与推论二矛盾。结论一得证。

结论二:对任意非负整数d,满足b-a=d的必输态(a,b)最多有一个(由于a,b具有对称性,常假定a<b)

反证:若有不同的必输态(a1,b1),(a2,b2),满足b1-a1=b2-a1=d;不妨设a1<a2;则存在方案(a2-a1,a2-a1)使a2,b2)转移到(a1,b1,与推论二矛盾。结论二得证。


 有了上面两个结论的思想,我们自然能想到一种构造第k个必输态的方法:

构造方法:

1.首先观察得(0,0)是第0个必输态

2.取前面未出现过的的最小数字(这里是1)做为a

3.取a+k做为b(这里是2),(a,b)是第k个必输态

接下来,解释一下步骤2和3。由结论一知,每个非负整数对应唯一的必输态,所以我们从小到大地选取a;由结论二知,任何d最多对应一个必输态,所以让b=a+k,即b-a=k,这样不会与其他状态的d重合

下证结论三:

结论三:上述构造方法是正确的,即按照这样的方法取出的状态都是必输态:

证:设第k个必输态为(ak,bk),那么a0=0,b0=0,我们知道(a0,b0)是必输态。用数学归纳法,若结论三对0,……,k-1成立,证明对k也成立。也就是证明(ak,bk)不能通过任何何方式转移到其他必输态。

首先,由构造方法第二条易知ak是单调递增的即a0<a1<a2......,所以bk也是单调递增的。所以(ak,bk)只可能转移到它之前的状态,即(a0,b0),(a1,b1)...(ak-1,bk-1)。

接下来证明(ak,bk)不可能转移到它之前的状态。设取石子的方案为(△a,△b),分三种情况讨论:

1.△a=0,因为ak在前面的必输态中未出现过,所以不能转移到必输态

2.△b=0,因为ak,bk单调递增,且bk>ak,所以bk比所有前面状态中出现过的数字都大,即bk在前面的必输态中未出现过,所以不能转移到必输态

3.△a≠0且△b≠0,那么△a=△b。所以(b-△b)-(a-△a)=k,不可能与前面的必输态相同

所以,(ak,bk)不能转移到必输态,它就是必输态!!!


进一步还有结论四:

结论四:该构造方法可以取到所有必输态

证:因为每次都取之前未出现过的最小数做为a,保证了每个数字都会出现。又由结论一知道,每个数字仅属于一个方案,所以该构造方法可以取到所有必输态。

到这里,好像证完了,但是别忘了,我们最初做了一个假设:对于游戏开始时的任何一种状态(a,b),它要么是必胜态,要么是必输态,我们之前的一切证明是基于这个假设的,现在我要基于我们上面的构造方案证明这个假设是正确的。

结论五:任何一个状态,若不是必输态,则一定是必胜态

其实我们只要做证明,任何一个状态(a,b),若它不是必输态,则有一种合法的方案(△a,△b)将它转化为必输态。

证:设(a,b)不是必输态(为了方便,不妨设a<b),由结论一知:存在必输态(ak,bk)使ak=a,bk≠b。

1.若bk<b,则方案(0,b-bk)可以将(a,b)转为(ak,bk)

2.若bk>b,设b-a=s,则:s<bk-a=bk-ak=k

因为bs-as=s=b-a,所以b-bs=a-as

所以方案(a-as,b-bs)可以将(a,b)转为(as,bs)

结论五得证。

到此,证明结束。




 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值