POJ - 2315 Football Game (NIMK博弈)

https://vjudge.net/problem/POJ-2315

 

 

 

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const double PI = acos(-1.0);

//模板部分
const int MAXN = 50;
int SG[MAXN];//需要处理的SG值数组
int XOR[MAXN];//储存每一个二进制位上的和
int xxx;//储存每一个SG值的临时变量
int num;//储存当前SG值有多少位的临时变量
int maxn;//储存最大的SG值位数

bool solve(int N, int M)//N表示SG数组的大小,从1到N,M表示每次可以取1到M堆
{
    memset(XOR, 0, sizeof XOR);
    maxn = -1;
    for (int i = 1; i <= N; i++) {
        xxx = SG[i];
        num = 0;
        while (xxx) {
            XOR[num] += xxx & 1;
            num++;
            xxx >>= 1;
        }
        maxn = max(maxn, num);
    }
    for (int i = 0; i < maxn; i++)
        if (XOR[i] % (M + 1))
            return true;//返回true表示先手必胜
    return false;//返回false表示先手必败
}
//上面模板

int N, M, L, R;
int s;

int main() {
    while (scanf("%d%d%d%d", &N, &M, &L, &R) != EOF) {
        s = L / (2 * PI * R) + 1;//只能射出周长的整数被,并且不能超过L
        for (int i = 1; i <= N; i++) {
            scanf("%d", &SG[i]);
            SG[i] = SG[i] / (2 * PI * R) + 1;
            SG[i] %= s;//NIM游戏每个石子堆的个数
        }
        if (solve(N, M))
            printf("Alice\n");
        else
            printf("Bob\n");
    }
}

 

来自大佬的博客,上面部分没怎么看懂,以后慢慢看吧

posted @ 2020-03-24 16:06  Hazelxcf  阅读(279)  评论(0编辑  收藏  举报