尼姆博弈(一)
Description:
Z和C两个人闲着无聊,就玩了个纸牌游戏。游戏是这样的,有两堆n和m张纸牌,纸牌是可以不同张数,也可以相同张数。玩游戏吗?必须有规则:一、可以任意的一堆中取走你想取走的纸牌张数,二、可以取走两堆中相同张数的纸牌,三、两人轮流取纸牌,最后把纸牌取完的胜。现在Z先取,问最后Z是胜还是败。(Z和C都很聪明,都采用最好的策略)
Input:
输入包含若干行,每行表示一局,其中每一行包含两个非负整数n和m,表示两堆纸牌的数目(n*m<1000 000 000).
Output:
输出对应也是若干行,每行输出不是Z就是C,如果Z胜,则输出Z,否则输出C。
Sample Input:
2 4
6 9
4 7
Sample Output:
Z
Z
C
这是第一种简单的尼姆博弈题,它有一个固定的模板,下面直接给出模板代码:
1 #include2 #include 3 int main(void) 4 { 5 double a,b; 6 int big,small,n,temp1,temp2; 7 while(scanf("%d%d",&small,&big) != EOF) 8 { 9 a = (1 + sqrt(5))/2;//黄金分割矩形10 b = (3 + sqrt(5))/2;11 if(small > big) {big ^= small;small ^= big,big ^= small;}//位运算交换两个变量的值12 n = ceil((big/b));//ceil函数的作用是求不小于给定实数的最小整数。ceil(2)=ceil(1.2)=cei(1.5)=2.00使用该函数需要包含头文件 ,该函数返回值为浮点型。13 temp1 = a*n; temp2 = b*n;14 if(small == temp1 && big == temp2) puts("C");//后手胜15 else puts("Z");//先手胜16 }17 18 return 0;19 }
尼姆博弈(二)
Description:
Z和C准备一个游戏,游戏是这样的,一开始桌上放有n堆纸牌,每次每个人能从任意一堆里面取走任意张纸牌,直到某个人无法取走纸牌为止,不能再取纸牌的人就为输。总是由Z开始。(假设Z和C都很聪明,都用最好的策略)
Input:
输入包含多组测试数据,每组测试数据占一行包括n+1个数字,第一数字为n,接下来n个数字代表每堆纸牌的张数,每堆的纸牌数量不会超过100 00 00,堆数n不会超过20,且大于1.
Output:
对于每组测试数据输出一行,如果Z能赢输出“Z”,否则输出“C”。
Sample Input:
2 45 45
3 3 6 9
Sample Output:
C
Z
这又是另一种简单的尼姆博弈,这种题也有一个固定的模板。只要将每堆牌的牌数进行异或和,如果最终异或和的值为0,则后手胜;否则,先手胜。下面给出这题的代码:
1 #include2 3 int main(void) 4 { 5 int n,ans,m; 6 while(scanf("%d",&n) != EOF) 7 { 8 ans = 0; 9 while(n--)10 {11 scanf("%d",&m);12 ans ^= m;13 }14 if(ans == 0) puts("C");15 else puts("Z");16 }17 18 return 0;19 }