Lightoj1253(博弈+NIM)

这题是反nim博弈,和nim类似。
nim游戏目标:最先把棋子取完的人胜利。
结论:若a1a2a3...^an=0,则先手必败,否则先手胜利。

而这一题要求最先把棋子取完的人失败,是反nim游戏
一个状态为必胜态,当且仅当:
1.所有堆的石子个数为1,有偶数个堆,即xor和=0;
2. 至少有一堆石子个数大于1,且xor和!=0
以上是解决本题需要的结论。

另外发现了一种nim游戏的变形题,和此题无关:
n堆石子,每次从不超过k堆中取任意多个石子,最后不能取的人失败。
结论:把n堆石子的石子数用二进制表示,统计每个二进制位上1的个数,
若每一位上1的个数mod(k+1)全部为0,则必败,否则必胜


#include "stdio.h"
int main()
{
	int i,j,t,m,n,k,f=1;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&k);
		int ans=0,flag=1;
		for (i=0; i<k; i++)
		{
			scanf("%d",&n);
			if (n!=1)
				flag=0;
			ans^=n;
		}
		printf("Case %d: ",f++);
		if (flag)//如果所有堆石子个数都是1
		{
			if (k%2==1)//堆数为奇数堆,先手必败
				printf("Bob\n");
			else
				printf("Alice\n"); //偶数堆,xor为0,先手必胜
		}
		else//至少有一个堆的石子数大于1
		{
			if (ans!=0)//如果xor!=0,先手胜利
				printf("Alice\n");
			else
				printf("Bob\n");
		}
	}

	return 0;
}
posted @ 2021-02-28 19:03  索饮  阅读(52)  评论(0编辑  收藏  举报