有n堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,左后取光者得胜(A,B进行,A先取)。
我们可以先从特殊情况来考虑:
(1)假设游戏一开始只有一堆有硬币,A便可以通过拿走所有硬币获胜
(2)假设有两堆有硬币,分别为n1,n2, A是否获胜不在于两堆硬币的多少,而取决于n1,n2是否相等 若n1==n2,B便可以模仿A来取物品获胜 若n1!=n2,设(n2>n1)A可以先从大堆中取走n2-n1个物品,促成n1==n2,之后A便可以模仿B来取物品获胜。
以此可以推广到n 堆上,要注意一点,如果有n堆,每堆都只有1个物品,此时若n为偶数,那么A必败,n为奇数A必胜。
来一个简单的题吧
HDU1849 http://acm.hdu.edu.cn/showproblem.php?pid=1849
就是把每个格子当成是1堆就好啦,,
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int main(){ 5 int m,n; 6 while(~scanf("%d",&n)&&n){ 7 int ans=0; 8 while(n--){ 9 cin>>m; 10 ans^=m; 11 } 12 if(ans==0)cout<<"Grass Win!"<<endl; 13 else cout<<"Rabbit Win!"<<endl; 14 } 15 }