基础数学算法-移棋子游戏

目录

题目-移棋子游戏

问题分析

因为图上是没有 的, 游戏一定会结束

问题的本质上就是 S G SG SG函数的定义
S G ( x ) = m e x { S G ( k ) } SG(x) = mex \{ SG(k)\} SG(x)=mex{SG(k)}

具体的定义和证明在基础数学算法博弈论章节

假设当前有 k k k个棋子, 并且有 t t t个局面, 先手必胜等价于
S G ( s 1 ) ⊕ S G ( s 2 ) ⊕ S G ( s 3 ) ⊕ . . . ⊕ S G ( s t ) ≠ 0 SG(s_1) \oplus SG(s_2) \oplus SG(s_3) \oplus ... \oplus SG(s_t) \ne 0 SG(s1)⊕SG(s2)⊕SG(s3)⊕...⊕SG(st)=0

可以用记忆化搜索 计算每个节点的 S G SG SG值, 对于当前点 u u u, 可以先计算后面所有节点 的 S G SG SG的值存到一个集合当中 , 然后从 0 0 0开始计算 m e x ( u ) mex(u) mex(u)的值

算法步骤

每个点的后继元素数量其实是边的数量 M A MA MA, 需要枚举所有点 N N N, 算法时间的复杂度 O ( N + M ) O(N + M) O(N+M)

代码实现

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

const int N = 2010, M = 6010;

int n, m, k;
int h[N], ed[M], ne[M], idx;
int f[N];

void add(int u, int v) {
    ed[idx] = v, ne[idx] = h[u], h[u] = idx++;
}

int sg(int x) {
    if (f[x] != -1) return f[x];

    set<int> s;
    for (int i = h[x]; ~i; i = ne[i]) {
        int v = ed[i];
        s.insert(sg(v));
    }

    for (int i = 0; ; ++i) {
        if (!s.count(i)) return f[x] = i;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    memset(h, -1, sizeof h);
    memset(f, -1, sizeof f);

    cin >> n >> m >> k;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        add(u, v);
    }

    int ans = 0;
    for (int i = 0; i < k; ++i) {
        int u;
        cin >> u;
        ans ^= sg(u);
    }

    cout << (ans ? "win" : "lose") << '\n';

    return 0;
}
相关推荐
老鼠只爱大米几秒前
LeetCode经典算法面试题 #114:二叉树展开为链表(递归、迭代、Morris等多种实现方案详细解析)
算法·leetcode·二叉树·原地算法·morris遍历·二叉树展开
Ivanqhz7 分钟前
现代异构高性能计算(HPC)集群节点架构
开发语言·人工智能·后端·算法·架构·云计算·边缘计算
小贺儿开发14 分钟前
Unity3D 八大菜系连连看
游戏·unity·互动·传统文化
HyperAI超神经33 分钟前
覆盖天体物理/地球科学/流变学/声学等19种场景,Polymathic AI构建1.3B模型实现精确连续介质仿真
人工智能·深度学习·学习·算法·机器学习·ai编程·vllm
执着25943 分钟前
力扣hot100 - 144、二叉树的前序遍历
数据结构·算法·leetcode
范纹杉想快点毕业1 小时前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
近津薪荼1 小时前
递归专题(4)——两两交换链表中的节点
数据结构·c++·学习·算法·链表
2501_940315261 小时前
【无标题】2390:从字符串中移除*
java·开发语言·算法
乐观勇敢坚强的老彭1 小时前
c++寒假营day01下午
c++·算法
散峰而望1 小时前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法