zoukankan      html  css  js  c++  java
  • 今天我们来玩游戏(博弈)

    鸣谢xym学长

    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    其实前面的都是废话
    精髓都在最后的SG定理中了

    很难理解?
    那好,我们举个栗子
    Nim游戏:
    这里写图片描述

    其实学长的课件上有写解法,
    但是我觉得写得太烂
    还是自己说比较清楚

    *复杂的情况我们考虑不过来,那就从简单的开始
    如果只有一堆,先手必胜(都拿走就好了)

    *两堆:
    如果有两堆中的石子数目相同,
    那么先手从任意一堆中拿走任意数目
    后手只要在另一堆中模仿ta的操作,
    先手必败

    观察一下我们可以发现
    如果石子的数目 ^ 和==0,先手必败
    !=0, 先手必胜

    难道这是巧合吗
    当然不是!!!

    实际上每堆石子的数目就是当前堆的SG值
    (这个怎么理解呢:如果我们从这一堆拿走石子,
    我们可以拿1,2,3,4…a[i]个,
    接下来的状态就是a[i]-1,a[i]-2,a[i]-3…0,
    a[i]是第一个达不到的状态,
    卡SG的概念,那么a[i]就是当前堆得SG啦)

    我们回顾一下定理
    这里写图片描述

    那我们照葫芦画瓢,异或一下,
    设答案为k

    如果k==0那么先手必败
    (极端考虑两堆数目相同的石子)

    如果k!=0先手必胜
    原因:k!=0,那k二进制表示一定有一个最高位j是1
    在所有石子中一定有一堆j位也是1(不然k中的1是怎么来的。。。),设为第i堆
    那先手把i堆的石子拿成a[i]^k,
    这样剩下的所有石子堆异或和就==0了,
    这就相当于个对手留下了一个必败局面
    此时先手必胜

    tip

    在一般的博弈中
    sg函数可以暴力求得,(卡住sg的定义)
    暴力枚举后继状态,求mex
    整个游戏的sg就是求一下子游戏的sg异或和即可

    一般规定
    sg==0,先手必败
    否则先手必胜

  • 相关阅读:
    WEB开发-动态验证码
    JQuery基础知识学习1
    JavaScript基础教程2-20160612
    JavaScript基础教程1-20160612
    基于Python的Flask的开发实战(第二节程序的基本结构)
    基于Python的Flask的开发实战(第一节Flask安装)
    Redis安装,主从,主备切换
    经典SQL语句大全
    js事件(Event)知识整理
    window.event.srcElement与window.event.target 触发事件的元素 触发事件对象的获取(非常重要)
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673409.html
Copyright © 2011-2022 走看看