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;
}