首页 > 其他 > 详细

集合-Nim游戏

时间:2021-07-20 19:31:46      阅读:37      评论:0      收藏:0      [点我收藏+]

与普通\(NIM\)游戏不同的地方是限制了每次拿东西的个数,这个个数会给定在集合\(S\)中,也就是说每次拿的数量只能在集合\(S\)中。

现在就可以把每一堆石子看成是一个有向图了,最主要就是用记忆化搜索来计算每一堆石子的\(SG\)函数,然后用定理判断即可。

#include <iostream>
#include <algorithm>
#include <unordered_set>
#include <cstring>

using namespace std;

const int N = 110, M = 10010;
int f[M], s[N];
int n, m;

int sg(int x) {
    if (f[x] != -1) return f[x];
    
    unordered_set<int> S;
    for (int i = 0; i < n; i++) {
        int t = s[i];
        if (x >= t) S.insert(sg(x - t)); 
    }
    
    for (int i = 0; ;i++) {
        if (!S.count(i)) return f[x] = i;
    }
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> s[i];
    cin >> m;
    
    memset(f, -1, sizeof f);
    int res = 0;
    for (int i = 0; i < m; i++) {
        int x; cin >> x;
        res ^= sg(x);
    }
    
    puts(res == 0 ? "No" : "Yes");
    
    return 0;
}

集合-Nim游戏

原文:https://www.cnblogs.com/ZhengLijie/p/15036291.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!