【 POJ - 2234】Matches Game(博弈-尼姆游戏)

Matches Game
POJ - 2234
这是一个简单的游戏。在这场比赛中,有几堆比赛和两名球员。两个球员依次上场。在每一个回合中,一个人可以选择一个桩,并从堆中取出任意数量的火柴(当然,被拿走的火柴数量不能为零,也不能大于所选堆中的火柴数量)。如果轮到一个球员后,没有比赛了,球员就是赢家。假设这两个球员都很清楚。你的工作是判断先上场的球员能否赢得比赛。
输入
输入由几行组成,每行都有一个测试案例。在行的开头,有一个整数 M(1 <= M <=20),这是桩数。然后是 M 正整数,不超过 100000000。这些 M 整数表示每个堆中的匹配数。
输出
对于每个测试案例,输出"是"在单行中,如果先玩的玩家会赢,否则输出"否"。
示例输入
2 45 45
3 3 6 9
样品输出
No
Yes
题意描述:多实例,给出火柴堆数以及每堆火柴数量,有两名队员来取火柴,每次拿走数量要大于0小于要拿的火柴堆的火柴数量,最后谁让火柴取完,谁赢,判断取完火柴是先取的队员赢还是后取得队员赢。

解题思路:这是一个尼姆游戏,利用异或运算(统计二进制1的个数奇数结果为1,偶数0)判断输赢,每次拿火柴之后,二进制的值会发生改变,如果是火柴堆是奇数堆且火柴等量,异或结果为1,先手赢如果偶数堆且火柴等量,后手赢。


```cpp
#include<stdio.h>
int main(void)
{
    
    
	int n,ans;
	int a[50];
	while(~scanf("%d",&n))
	{
    
    
		ans=0;
		for(int i=1;i<=n;i++)
		{
    
    
			scanf("%d",&a[i]);
			ans=ans^a[i];//二进制异或运算统计1的个数,奇数1,偶数0 
		}
		if(ans!=0)//先手赢 奇堆等量 
			printf("Yes\n");
		else//后手赢 偶堆等量 
			printf("No\n");
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/m0_58245389/article/details/120257143