(一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规
定每次至少取一个,最多取m个。最后取光者得胜。

① 当你面前的物品为0 个时 , 那么你一定是败者, 因为前面的人已经将所有的物品都取完,前面的人已经赢了.

    也就是   物品的个数  n = 0 时 ,为当前者的必败点 必败者. (目前可以这样理解...emmm.)

② 当你面前的物品 个数为 0 <n <= m 时 ,为必胜点 ,你想想, 你面前有 (0,m] 个物品 ,你可以一次性全拿完(你够聪明,每一步都可以做出最优决策) . 

③ 当你面前的物品个数 n = m+1 时 , 为必败点 (你是失败者) , 因为你最多可以取m个 , 那么还剩一个,则另一个人在下次取物品的时候就赢了 , 你就输了 ;   同样当你取 1 个时 , 则 还有m个物品 , 那么对手不傻,他一定会全部取走对吧 , 那么你就输了 ;

④  当你面前的物品数 n =2m + 1 ( 或者写成  ( m+1)+m   ),为必胜点, 可以这样想 ,(约定 : 第一次你取,然后我取哈) ,你取完后 (m+1) 一定会 是 no ∈[1,m]  ,这时 n = no + m  ∈[m+1,2m] ; 然后到我取了,  m+1 <= n < 2m ,不等式左边m+1 是我必败的情况③ ,右边也是我必败,你必胜 . 

⑤  当你面前的物品 n =  (m+1)+m+1 时 ,必败(只能到达④)

综上 n = k*(m+1) + s ;

s 如果等于0(n 能够整除 m+1) ,则先者必败,

s 如果不等于0 ,则先者必胜 .

 

Problem Description

十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻。
今天,大家选择上机考试,就是一种勇敢(brave)的选择;这个短学期,我们讲的是博弈(game)专题;所以,大家现在玩的也是“勇敢者的游戏”,这也是我命名这个题目的原因。
当然,除了“勇敢”,我还希望看到“诚信”,无论考试成绩如何,希望看到的都是一个真实的结果,我也相信大家一定能做到的~

各位勇敢者要玩的第一个游戏是什么呢?很简单,它是这样定义的:
1、  本游戏是一个二人游戏;
2、  有一堆石子一共有n个;
3、  两人轮流进行;
4、  每走一步可以取走1…m个石子;
5、  最先取光石子的一方为胜;

如果游戏的双方使用的都是最优策略,请输出哪个人能赢。

Input

输入数据首先包含一个正整数C(C<=100),表示有C组测试数据。
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。

 

Output

如果先走的人能赢,请输出“first”,否则请输出“second”,每个实例的输出占一行。

Sample Input

23 2 

4 3 

Sample output

first

second

#include <iostream>
#include <cstdio>
using namespace std ;
int main()
{
int i ;
int T ;

cin >> T ;
while(T--)
{
int n , m ;

scanf("%d%d",&n,&m);

if(n%(m+1)!=0)
{
printf("%s\n","first");
}
else
{
printf("%s\n","second");
}
}




return 0 ;
}

 

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

我们用( a[k] ,b[k] ) ,(  a[k]<b[k]  ) (k∈0,1,2,3,...)来表示两堆物品的数量.

首先我们从简单的情况分析 :

如果现在的局势为 (0,0) 则可以看出肯定是之前的人在上一局中取完了.

假设 现在的局势为 (1 ,2 ) ,那么先手只有四中取法了.

(1) 如果 ,先手取走第一堆中的 1 个 ,变为 (0,2) ,则后手只需要取走第二堆所有的就就变成 奇异局势 (0 ,0 ), 所以结果就是先手输,后手赢.

(2)如果 ,先手取走第二堆中的一个, 变为(1,1) , 则后手只需取走两堆中的1 个就变成 奇异局势 (0 ,0 ) ,  所以结果就是先手输,后手赢.

(3) 如果 ,先手取走第二堆中的 2 个 ,变为 (1,0) ,则后手只需要取走第一堆所有的就变成 奇异局势 (0 ,0 ) .所以 结果就是先手输,后手赢.

(4) 如果,先手在两堆中各取 "1 " ,变成(0,1) ,则后手取走第二堆的 1 就变成 奇异局势 (0 ,0 ) .所以 结果就是先手输,后手赢.

所以由此可得, 先手必输 . 

假设现在的局势是(3,5),首先根据上面分析的经验,我们知道先手肯定不能把任意一堆物品取完,这是因为每次可以从任意一堆取走任意个物品,那么后手就可以直接把另一堆取完,所以后手获胜。

所以我们这里就不分析那些情况,来分析其他的情况。

先看在一堆中取的情况:

(1) 假设先手在“3”中取1个,后手就可以在“5”中取走4个,这样就变成了(1,2)的局势,根据上面的分析,我们知道是先手输,后手获胜。

(2) 假设先手在“3”中取2个,后手就可以在 “5” 中取走3个,这样也变成了(1,2)的局势了,还是先手输,后手获胜。

(3)假设先手在“5”中取1个,后手就在 “3”和“5” 中各取走2个,这样又成了(1,2)的局势了,先手输,后手赢。

(4)假设先手在“5”中取2个,后手就在 “3”和“5” 中各取走3个,这样变成了(0,0)的局势,先手输,后手赢。

(5)假设先手在“5”中取3个,后手就在 “3”和“5” 中各取走1个,也变成了(1,2)的局势,先手输,后手胜利。

(6)假设先手在“5”中取4个,后手在“3”中取走1个,还是(1,2)的局势,先手输,后手赢。

我们发现上面列举的这几种局势,无论先手怎么取都是后手赢。

我们可以来找找那些先手必输局势的规律

第一个(0,0)

第二个(1,2)

第三个(3,5)

第四个(4 ,7)

第五个(6,10)

第六个 (8,13)

 

第七个 ( 9 , 15)

第八个 ( 11 ,18)

第n个(a[k],b[k])

我们把这些局势称为“奇异局势

我们会发现他们的差值是递增的,分别是0,1,2,3,4,5,6,7......n

我们用数学方法分析发现这些局势的第一个值是未在前面出现过的最小的自然数。

继续分析我们会发现,每种奇异局势的第一个值总是等于当前局势的差值乘上1.618

我们都知道0.618是黄金分割率。而威佐夫博弈正好是1.618,这就是博弈的奇妙之处!

即 a[k] = (int)  ((b[k] - a[k])*1.618) 注:这里的int是强制类型转换,注意这不是简单的四舍五入,假如后面的值是3.9,转换以后得到的不是4而是3,也就是说强制int类型转换得到的是不大于这个数值的最大整数。

在编程题中,有些题目要求精度较高,我们可以用下述式子来表示这个值

1.618 = (sqrt(5.0) + 1) / 2

下面我们来看一道威佐夫博弈的入门题

                                 取石子游戏

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9288    Accepted Submission(s): 5330

 

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

思路 :由于是你先去,"你" 是先手 , 由上面的先手必败的策略规律,得到是否败或者胜 .

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std ;
int main()
{
// 威佐夫博弈
int n ,m ;
int i ;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n>m)
{
swap(n,m);
}
int d = (m-n);

int t =(int)d*(sqrt(5.0)+1)/2;
if(t == n)
printf("0\n");
else
printf("1\n");

}




return 0 ;
}

(三)尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的
物品,规定每次至少取一个,多者不限,最后取光者得胜。

    这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首
先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是
(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一
下,(1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情
形。

我们发现 , 任何一个奇异局势(a,b,c) 满足 ,

三个经典博弈_#include

= 0  (

三个经典博弈_#include_02

为异或符号) ,那么对于任何人面对奇异局势都是一种必败的状态 .

如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b <c (c = max(a,b,c) ) ,那么我们可以把

c 变成 (a

三个经典博弈_#include_02

b)  ,这样 a 

三个经典博弈_#include_02


三个经典博弈_#include_02

(a

三个经典博弈_#include_02

b) = 0 

三个经典博弈_#include_02

0 = 0 ,要将c 变为a(+)b,只要从 c中减去 c-( (a

三个经典博弈_#include_02

b)) 即可 . 

    例1。(14,21,39),14(+)21=27,39-27=12,所以从39中拿走12个物体即可达
        到奇异局势(14,21,27)。

     例2。(55,81,121),55(+)81=102,121-102=19,所以从121中拿走19个物品
就形成了奇异局势(55,81,102)。

    例3。(29,45,58),29(+)45=48,58-48=10,从58中拿走10个,变为(29,4
5,48)。

未完 .. .