尼姆博弈(Nimm Game)+反尼姆博弈

来源:互联网 发布:淘宝网有甲睾酮片 编辑:程序博客网 时间:2024/04/30 08:17

尼姆博弈:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,每次最少取一件,取到最后一件物品的人获胜。

结论就是:把每堆物品数全部异或起来,如果得到的值为0,那么后手胜,否则先手胜。

百度详解与证明点击打开链接

#include<cstdio>int main(){    int n,ans,temp;    while(scanf("%d",&n)!=EOF)    {        temp=0;//0和任何数异或都为其本身;         for(int i=0;i<n;i++)        {            scanf("%d",&ans);             temp^=ans;        }        if(temp==0)  printf("后手必胜\n");        else printf("先手必胜\n");    }    return 0;}

 反尼姆博弈结论:n堆物品,全部异或结果为ans,统计富裕堆的个数为c;

先手胜有两种情况:

第一,ans=0且c<2;

第二,ans为真且c为真;

#include<cstdio>int main(){    int t,m,n;    scanf("%d",&t);    while(t--)    {        int ans=0,c=0;        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%d",&m);            if(m>1) c++;//统计富裕堆个数            ans^=m;        }        if((!ans && c<2) || (ans && c)) printf("先手胜\n");        else printf("后手胜\n");    }    return 0;}

1 0
原创粉丝点击