C语言程序设计取石子游戏,取石子游戏 (C++代码)

解题思路:

介绍一下k*(1+√5)/2的由来(Betty定理)。

若a,b是正无理数且1/a + 1/b == 1,记P={[ta]|t∈Z∗},Q={[tb]|t∈Z∗},则P,Q是Z*的一个划分,构造成了Betty数列。 猜想第t行的第一个数满足[ta]的形式(所谓第t行是指先手必负时的石子堆数量的第k种情况)。

则第二个数满足[ta] + t == [ta+t] == [t(a+1)]

由Betty定理的定义: 1/a + 1/(a+1) == 1

解得a == (√5+1)/2

想法2:

这道题就是典型的威佐夫博弈(Wythoff Game)

这里给大家一些结论 http://blog.csdn.net/ac_gibson/article/details/41624623

一. 巴什博奕(Bash Game):

A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30。这应该是最古老的关于巴什博奕的游戏了吧。

其实如果知道原理,这游戏一点运气成分都没有,只和先手后手有关,比如第一次报数,A报k个数,那么B报5-k个数,那么B报数之后问题就变为,A和B一块报数,看谁先报到25了,进而变为20,15,10,5,当到5的时候,不管A怎么报数,最后一个数肯定是B报的,可以看出,作为后手的B在个游戏中是不会输的。

那么如果我们要报n个数,每次最少报一个,最多报m个,我们可以找到这么一个整数k和r,使n=k*(m+1)+r,代入上面的例子我们就可以知道,如果r=0,那么先手必败;否则,先手必胜。

二. 威佐夫博弈(Wythoff Game):

有两堆各若干的物品,两人轮流从其中一堆取至少一件物品,至多不限,或从两堆中同时取相同件物品,规定最后取完者胜利。

直接说结论了,若两堆物品的初始值为(x,y),且x

记w=(int)[((sqrt(5)+1)/2)*z ];

若w=x,则先手必败,否则先手必胜。

三. 尼姆博弈(Nimm Game):

尼姆博弈指的是这样一个博弈游戏:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。

结论就是:把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜。

四. 斐波那契博弈:

有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。

结论是:先手胜当且仅当n不是斐波那契数(n为物品总数)

注意事项:

参考代码:

你可能感兴趣的:(C语言程序设计取石子游戏)