北理工C语言取石子

核心提示#include<stdio.h>#include<conio.h>int?main(void)//也就是a或者b有一项为2或者1时,有必胜方法.{int?i,?T,?a[50]?=?{?0?},?b[50]?=?{?0?},?c[50]?

#include<stdio.h>

#include<conio.h>

int?main(void)//也就是a或者b有一项为2或者1时,有必胜方法.

{

int?i,?T,?a[50]?=?{?0?},?b[50]?=?{?0?},?c[50]?=?{?0?};

scanf("%d",?&T);

for?(i?=?0;?i?<?T;?++i)

{

scanf("%d",?&a[i]);

scanf("%d",?&b[i]);

if?(a[i]?==?1?||?a[i]?==?2?||?b[i]?==?1?||?b[i]?==?2)

c[i]?=?1;

}

for?(i?=?0;?i?<?T;?++i)

{

if?(c[i]?==?1)

printf("YESn");

else

printf("NOn");

}

getch();

return?0;

}

取石子问题

简单题, 巴什博弈 。

显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?

(n-1)%(m+1)==0则后手胜利

先手会重新决定策略,所以不是简单的相反行的

威佐夫博弈(Wythoff's game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。

那么任给一个局势, (a,b),怎样判断它是不是奇异局势呢?我们有如下公式:

指的是这样的一个博弈游戏,目前有任意堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:

1)每一步应取走至少一枚石子;每一步只能从某一堆中取走部分或全部石子;

2)如果谁取到最后一枚石子就胜。

判断当前局势是否为必胜(必败)局势:

把所有堆的石子数目用二进制数表示出来,当 全部这些数按位异或 结果为0时当前局面为必败局面,否则为必胜局面;

有一堆个数为n的石子,游戏双方轮流取石子,满足:

1)先手不能在第一次把所有的石子取完;

2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。

约定取走最后一个石子的人为赢家,求必败态。

这个游戏叫做斐波那契博弈,肯定和 斐波那契数列 : 有密切的关系。如果试验一番之后,可以猜测: 先手胜当且仅当n不是斐波那契数。换句话说,必败态构成斐波那契数列。

这种博奕游戏一般假设双方都是同样聪明的 ,所以根据石子总数不同游戏结果有两种:

1)如果石子总数为4n+1的话,先取的人必输。

后取的人的策略是,每次取的石子数总与先取的人所取数目总和为4,这样石子总数总是4个4个往下减,直到最后剩下1个,被先取的人取走从而使其输掉游戏。

2)如果石子总数为上述情况以外的4n+2,4n+3,4n这三种情况中的任一种,那么先取的人必赢。

其策略是,第一轮取掉若干(对应上述三种情况分别取掉1,2,3个)石子,使剩下的石子总数是4n+1,从而使后取的人面临第一种必输情况即可。

 
友情链接
鄂ICP备19019357号-22