• 经典 Nim 游戏,sg 函数与 sg 定理


    0. 前置芝士

    定义状态

    ( ext{P}):表示当前局面下先手必败。

    ( ext{N}):表示当前局面下先手必胜。

    ( ext{N,P}) 状态的转移满足如下性质:

    1. 合法操作集合为空的局面为 ( ext{P})

    2. 可以移动到 ( ext{P}) 的局面为 ( ext{N})

    3. 所有移动只能到达 ( ext{N}) 的局面为 ( ext{P})

    1. 楔子

    1.1. 问题

    一共有 (n) 堆石子,第 (i) 堆中有 (a_i) 个石子。

    每一次操作小 (mathtt{G}) 和小 (mathtt{D}) 可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子。

    两个人轮流行动,取走最后一个的人胜利。小 (mathtt{G}) 为先手。

    1.2. 结论

    1.2.1. 内容

    对于局面 ((a_1,a_2,...,a_n)),它是 ( ext{P}) 局面当且仅当 (a_1 ext{xor} a_2 ext{xor}... ext{xor} a_n=0)

    1.2.2. 证明

    容易发现只要满足以下三个条件即可:

    1. 这个判断将最终态判为 ( ext{P}) 局面。显然最终态全零。
    2. 根据这个判断被判为 ( ext{N}) 局面的局面一定可以移动到某个 ( ext{P}) 局面。设异或和为 (k),则一定存在 (a_i),其二进制表示在 (k) 的最高位上是 (1)。由于二进制较高位上的 (1) 表示的十进制一定大于位数较低位上的 (1) 表示的十进制之和,则 (a_i ext{xor} k< a_i)(异或 (k) 也不会影响 (a_i) 的更高位)。那么我们将 (a_i) 改成 (a_i ext{xor} k),异或和就变成 (0) 了。
    3. 根据这个判断被判为 ( ext{P}) 局面的局面无法移动到某个 ( ext{P}) 局面。异或和为 (0) 只能异或 (0) 即取 (0) 个石子,故无法移动到某个 ( ext{P}) 局面。

    2. ( ext{Sprague-Grundy}) 函数

    2.1. 定义

    ( ext{ICG}) 的每个局面看成一个节点,对每个局面和它的子局面连一条有向边。这就转变成了在有向无环图上的移动游戏。

    定义节点 (u)( ext{sg}) 函数为

    [ ext{sg}(u)= ext{mex}{ ext{sg}(v) |v ext{ is a son of }u} ]

    3. ( ext{Sprague-Grundy}) 定理

    3.1. 内容

    总游戏的 ( m sg) 函数值为它所包含的独立子游戏 ( m sg) 函数值的异或和。

    3.2. 证明

    实际上,这和上文取石子问题是一样的 —— 总游戏就是所有石子,独立子游戏就是一堆石子。

    同上文判断方法,我们判断三个条件:

    1. 这个判断将最终态判为 ( ext{P}) 局面。显然最终态即叶子节点为零。
    2. 根据这个判断被判为 ( ext{N}) 局面的局面一定可以移动到某个 ( ext{P}) 局面。首先可以发现,当 ( ext{sg}(u)=k) 时,( ext{sg}(v)) 必包含区间 ([0,k)) 的每个数,这是不是和取石子游戏很相似?用上文证明方法即可。
    3. 根据这个判断被判为 ( ext{P}) 局面的局面无法移动到某个 ( ext{P}) 局面。

    4. 例题

    上课五分钟。

    “好了我把新课讲完了,接下来我们开始做题。”

    4.1. (sf Interval Game 2)

    设总游戏状态为 ([1,100)),代表所有区间都没有被选择。

    接下来的问题在于是否能将总游戏状态划分成独立子游戏。显然如果我们每次选取区间 ([l_i,r_i))(即有向边),总游戏状态可以被划分成 ([1,l_i)cup [r_i,100))(即子局面)。

    所以有:

    [ ext{sg}(L,R)= ext{mex}{ ext{sg}(L,l_i) ext{ xor sg}(r_i,R)|[l_i,r_i)subseteq [L,R)} ]

  • 相关阅读:
    单链队列
    栈的顺序存储表示
    顺序队列
    串的定长顺序存储表示
    串的堆分配存储
    双向循环链表
    单循环链表的表示和实现
    串的块链存储表示
    线性表的顺序表示和实现
    线性表的单链表表示和实现
  • 原文地址:https://www.cnblogs.com/AWhiteWall/p/14403827.html
Copyright © 2020-2023  润新知