HDU 5011 Game nim博弈

来源:互联网 发布:人工智能发展现状论文 编辑:程序博客网 时间:2024/05/16 03:54

题意:两个人从n堆石子中取石子。规则如下:1.任选一堆,取一个或取多个。2.取完石子后,你可以选择是将该堆石子分成两堆,还是不分。取完最后一个石子的人为胜者。问先手能否必胜。

思路:直接sg函数打表,发现和最原始的nim博弈是等价的。证明待补。

代码如下:

#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAX = 20000;int main(void){    //freopen("input.txt","r",stdin);    int T,N;    int tmp;    while(scanf("%d",&N) != EOF){        int ans = 0;        for(int i = 0; i <N; ++i){            scanf("%d", &tmp);            ans ^= tmp;        }        if(ans == 0) puts("Lose");        else puts("Win");    }    return 0;}/*int SG(int n){    memset(vis,0,sizeof(vis));    for(int i = 1; i <= n; ++i){        int t = n - i;        vis[sg[t]] = true;        for(int j = 1; j < t; ++j)            vis[sg[j] ^ sg[t - j]] = true;    }    int i = 0;    for(;vis[i];++i);    return sg[n] = i;}*/

0 0
原创粉丝点击