题目描述:有3堆硬币,分别是3,4,5
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。
二人轮流取硬币。
每人每次只能从某一堆上取任意数量。
不能弃权。
取到最后一枚硬币的为赢家。
求先取硬币一方有无必胜的招法。
思路:根据尼姆的理论,若每组硬币数相异或的值为0,则先取硬币的人已经无法获胜,若不为0,则先取硬币的玩家必能找到一种策略获胜。
#include<stdio.h>
//"^"为异或符号
int main()
{
int a[3] = {3,4,5};
int sum = 0;
for(int i = 0 ; i < 3 ; i++)
{
sum ^= a[i];
}
if(sum == 0)
{
printf("defeat\n");
return 0;
}
for(int i = 0 ; i < 3 ; i++)
{
int x=sum ^ a[i];
if(x < a[i])printf("%d——>%d\n",a[i],x); //利用A^B^B = A,求出除了a[i]外的元素异或所得值
}
return 0;
}