zoukankan      html  css  js  c++  java
  • staircase nim 经典组合游戏

    游戏开始时有许多硬币任意分布在楼梯上,共n阶楼梯从地面由下向上编号为0到n。游戏者在每次操作时可以将楼梯j(1<=j<=n)上的任意多但至少一个硬币移动到楼梯j-1上。游戏者轮流操作,将最后一枚硬币移至地上的人获胜。

    分析:
    这个问题与nim游戏的区别在于移走的硬币不是被扔掉而是被放进了另一堆硬币之中,考虑能否将这一部分楼梯排除考虑范围。奇数号楼梯只能将硬币扔到偶数号楼梯之中,同样偶数号楼梯上的硬币也只会被扔上奇数号楼梯。只考虑奇数号楼梯nim,若偶数楼梯只作容器,那么游戏变为nim。当偶数号楼梯上的硬币可以将硬币移出时,我们是不是仍然可以用nim的方法判断必败状态?
    将奇数台阶的硬币数nim和为0称作条件A,结束状态满足条件A;任何满足条件A的状态都到达满足条件A的状态;任何不满足条件A的状态都可以到达满足条件A的状态(nim)。因此一个状态为必败状态当且仅当它满足条件A

    如果只考虑奇数位上,把奇数位上的硬币放入偶数位,看做nim的取石子游戏。
    那么这是我们类似可以得到奇数位的SG函数。如果我们可以做到使SG=0.
    那么如果对方在奇数位上取硬币,那么我们也类似nim在奇数位上取硬币使SG值回到0;
    如果对方在偶数位上取硬币。那么我们就把他刚刚从偶数位上传到奇数位上的硬币数。
    原封不动的再传回偶数位。这样就可以保持SG=0;
    从而保证自己必胜~

    Tips@USC:
    由此可见单单是staircase nim就有多种变化
    下面是给我启示的一段话:
    由于只能向左移,而且不能相互交叉。我们把两个硬币之间的空间看作石子堆,一次左移相当于把某个石子堆(楼梯j)的石子移到了右边那个石子堆(楼梯j-1),最后的区间相当于最低的一层,题目实质就变成了阶梯博弈。
    [Souce]http://blog.sina.com.cn/s/blog_6a6aa7830100p4nb.html
    这样 对于POJ的这道题就很好理解了。
    关键在于问题转化,为何可以把偶数对的转化成为Nim游戏?

    台阶游戏类型1:每次移动1个,移动N位
    下面模拟2个小石头的情况:
    |_ _ _ _ o _ _ _ _ o _ _ _|
    可以这样想,左边的石子跑到左边界,不就是单堆的Nim了?
    上图可以转化成:
    |o _ _ _ _ o _ _ _ _ _ _ _|
    同样地对于下图,两堆的情况:
    |_ _ o _ _ o _ o _ _ o _ _|
    可以转化为:
    |o_ _ o o _ _ o _ _ _ _ _ |
    于是乎对于每两个石子之间的空隙数,可以作为Nim游戏中的石子数,简单的Nim大家都知道怎么做了.
    WHY?
    为何可以转换呢?我们可以知道,可以通过平移来转换成图。为何可以平移转换呢?
    相当于A移动某组中左边的石子,则B移动同组中右边的石子相同距离。
    同样A移动某组中右边的石子,则B移动同组中左边的石子相同距离。
    这样就得到了平移的效果,于是乎,用Nim的方法就能把转化后的问题解决了。

    台阶Nim游戏类型2:
    在介绍的时就是类型2,移动N个石子,每次一位。这样以偶数号台阶为垃圾桶,A从奇数号(j)台阶拿走N个石子放于偶数号(j-1)台阶(相当于扔掉),B从中拿回来,放于奇数号(j-2)台阶;同理A从偶数号拿石子。在这种模型下转化成Nim游戏,对奇数号台阶异或操作。

    类型3:
    每次移动1个,每次1位.这不算博弈吧。我自己想的...

    类型4:
    每次N位,一次M个。不知道怎么做... 求解释....

  • 相关阅读:
    javascript-事件代理
    控制DIV属性——实现盒子长、宽、背景等变化
    mac环境下VSCODE 全局搜索无效的问题
    VSCODE snippets的使用
    JS单线程与setTimeout执行原理(转载)
    ES6
    SQL聚合函数
    MySQL函数(转发)
    关于mysql中int(1)中int后面的数字(转发)
    关于xcode8.0 VVDocumenter无法使用的解决办法
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2991680.html
Copyright © 2011-2022 走看看