上进小青年

导航

4.尼姆博弈

有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 }
View Code

 

posted on 2016-07-26 11:26  上进小青年  阅读(248)  评论(0编辑  收藏  举报