sg函数和nim游戏的关系

  本人萌新,文章如有错漏请多多指教~~

  我在前面发了关于nim游戏的内容,也就是说给n堆个数不同的石子,每次在某个堆中取任意个数石子,不能取了就输了。问你先手是否必胜。然后只要这n堆石子的石子数异或和等于0就必败,不等于0就必胜。这个是通过利他,利己两个态的定义和转换归纳证明的。可是nim游戏只是博弈论中的一个模型,还有其他模型怎么快速判断胜负呢?例如说这道题,它不是一个nim游戏。我们现在要把它转换成一个nim游戏。

  首先定义ICG,只有满足这种定义的博弈论模型才能转换成nim游戏。满足以下条件的游戏是ICG(可能不大严谨):

  1. 有两名选手
  2. 两名选手交替对游戏进行移动,每次一步,选手可以在有限的合法移动集合中任选一种进行移动
  3. 对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作,以前的任何操作,骰子的点数或者其它什么因素。
  4. 如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是无法移动),则这名选手负。

  看上去是不是感觉好像没什么卵用(棋子只有一种颜色)。定义mex运算,这是一个施加于一个集合的运算,表示最小的,不属于这个集合的非负整数。例如mex{0, 1, 2, 4}=3,mex{2, 3, 5}=0,mex{}=0。对于一个给定的有向无环图,定义关于图的每个顶点的SG=Sprague-Garundy函数为:\(g(x)=mex\{g(y)\mid y是x的后继\}\)。

  如果一个游戏是ICG。那么一种局面就相当于一个nim游戏,每个棋子对应1堆石子。我们来一步步推导:

  1. 我们用sg值表示一个点的sg函数值,也用sg值表示某个棋子所在点的sg值。
  2. 首先来个引理,结点编号\(s\ge sg(x)\)。
  3. 如果当前局面,所有棋子sg值都是零,先手必输(回想一下nim博弈,如果石子都被取完了你就输了)。分类讨论:如果当前局面上的所有棋子都不能走了,显然它们的sg值都是零,那么先手必输。如果还有棋子能走,我们可以选一个棋子走一步,那么这个棋子的sg值就会变成非零。非零说明什么——说明当前棋子所在结点的孩子结点一定有一个sg函数值为零,那对手只要将棋走到那个结点就行了,局面还是所有棋子sg值都为0!
  4. 我们来讨论除了2的普通局面。普通局面,就相当于有棋子的sg值不为零。分类讨论:如果现在对手走,sg值异或和为零,他会选一个棋子,然后把这个棋子放到它的孩子结点上。sg值有可能增加,也有可能减少。只要sg值增加,你就把它还原回来(根据sg函数的定义!)。这个棋子的sg值总有不能增加的一天(因为第一条的那个引理)。所以说:增加某个棋子的sg值是毫无意义的,肯定能被还原。因此,我们干脆不考虑sg值增加的情况。所以,对手只能把某一个棋子的sg值减少。同时根据sg函数的定义,sg值可以变成比当前值小的任何值。

也就是说,如果我们有了一个ICG,那么我们把每个点的sg值求出来,变成一堆石子。那么判断ICG是否先手赢就是判断在这一堆石子上搞nim赢不赢。异或和即可。

sg函数和nim游戏的关系的更多相关文章

  1. 【UVA11859】Division Game(SG函数,Nim游戏)

    题意:给定一个n*m的矩阵,两个游戏者轮流操作. 每次可以选一行中的1个或多个大于1的整数,把它们中的每个数都变成它的某个真因子,不能操作的输. 问先手能否获胜 n,m<=50,2<=a[ ...

  2. 博弈论基础之sg函数与nim

    在算法竞赛中,博弈论题目往往是以icg.通俗的说就是两人交替操作,每步都各自合法,合法性与选手无关,只与游戏有关.往往我们需要求解在某一个游戏或几个游戏中的某个状态下,先手或后手谁会胜利的问题.就比如 ...

  3. Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )

    题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候 ...

  4. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  5. 【博弈论】浅谈泛Nim游戏

    Nim游戏在ACM中碰到了,就拎出来写写. 一般Nim游戏:有n堆石子,每堆石子有$a_i$个,每次可以取每堆石子中$[0,a_i-1]$,问先手是否有必胜策略. 泛Nim游戏:每堆石子有$a_i$个 ...

  6. 【基础操作】博弈论 / SG 函数详解

    博弈死我了……(话说哪个小学生会玩博弈论提到的这类弱智游戏,还取石子) 先推荐两个文章链接:浅谈算法——博弈论(从零开始的博弈论) 博弈论相关知识及其应用 This article was updat ...

  7. SG函数和SG定理【详解】

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  8. SG函数&&SG定理

    必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点,处于此情况下,双方操作均正确的情况下必胜. 必胜点和必败点的 ...

  9. sg函数总结

    http://blog.csdn.net/luomingjun12315/article/details/45555495 这一段时间写的题和我接下来要展示的一些概念都来自这里↑. 必胜点和必败点的概 ...

随机推荐

  1. artDialog 简单使用!

    简介 artDialog是一个轻巧且高度兼容的javascript对话框组件,可让你的网页交互拥有桌面软件般的用户体验. 功能: 支持锁定屏幕(遮罩).模拟alert和confirm.多窗口弹出.静止 ...

  2. C++(六)— 输入方式

    1.输入包含空格的字符串 使用 getline(cin, str)读取一行字符串,遇到换行符停止:cin>>str,是遇到空格就停止. 实现:输入两个字符,在第一个字符中删除第二个字符中出 ...

  3. 一个很有参考意义的unity博客

    http://blog.csdn.net/lyh916/article/details/45133101

  4. hibernate一级缓存和二级缓存的区别(转)

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事 ...

  5. Sharepoint list webpart

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.0.min.js&qu ...

  6. bzoj 3533: [Sdoi2014]向量集 线段树维护凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3533 题解: 首先我们把这些向量都平移到原点.这样我们就发现: 对于每次询问所得到的an ...

  7. oracle单实例12.2.0.1安装

    说明:本文描述oracle linux 6.8 安装 oracle 12.2.0.1 0. 查看操作系统版本 [root@12c01 ~]# cat /etc/os-release NAME=&quo ...

  8. android开发 服务器端访问MySQL数据库,并把数据库中的某张表解析成xml格式输出到浏览器

    我们此时只要写一个Servlet就可以了: public class UpdateMenuServlet extends HttpServlet { /** * */ private static f ...

  9. Navicat生成数据库结构同步SQL

    作为一个苦逼的技术男,在做开发的时候经常会遇见程序版本升级,数据库结构变化.我们需要一个快捷的方式让客户尽快从旧版本数据库结构更新至新版本数据库结构.如果每做一次改动我们就记录一下当然是好事,但是万一 ...

  10. POJ3468(线段树区间维护)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 85502   ...