博客
关于我
Good Luck in CET-4 Everybody! HDU - 1847 [博弈树,BASH博弈]
阅读量:519 次
发布时间:2019-03-08

本文共 589 字,大约阅读时间需要 1 分钟。

一堆N个牌,玩家每家可以一次抽取1, 2, 4, 8,..., 即2^k张,直到无法抽取为止,无法抽取的一方输掉游戏。本文通过分析得出当N是3的倍数时,处于必败态。接着通过递归定义和数学证明了这一结论。

首先,终止状态N=0为必败态。当前局面为必败态时,任何可能的操作都会导致转移到必胜态。必胜态可以通过选择适当的操作将对手送入必败态。

详细证明:

  • 当N=0(游戏结束):必败状态显然成立。
  • 当前局面为必败态:任何操作能抽取的局面(即N减少到N'=N-2^k),由于2^k不能被3整除,因此N'与N的差为3m,因此对手处于必胜态。
  • 当前局面为必胜态:当N不为3倍数时,存在一个k,使得N-2^k能被3整除。通过对N<1000的具体情况进行验证,发现这一结论成立。
  • 测试与实现:

    • 编写了一个SG函数版本的动态规划和递归实现,其中动态规划记忆化数组用于存储结果,递归函数用于验证每种可能的局面。
    • 对于give函数,预计算了所有N=1到1005的情况,结果存储在数组中。
    • 对于DFS版本,使用记忆化数组和深度优先搜索进行验证,得到一致的结论。

    结论:

    通过分析和测试,得出当N为3倍数时该局面必败,其他情况下必然存在合法的操作将对手送入必败态。当N=3m时,无论选择抽取多少张牌,对手总能调整策略使对方无法继续。因此,游戏规则的关键在于是否能将局面转换为3的倍数。

    [代码部分见附件]

    转载地址:http://kckiz.baihongyu.com/

    你可能感兴趣的文章
    洛谷【数据结构1-1】线性表
    查看>>
    Sci-Hub重生了!这回用上了分布式网络
    查看>>
    颜宁:学术圈问题很多,也不分国籍,希望年轻一代守住底线
    查看>>
    Visual Studio2019 连接 Sql Server
    查看>>
    如何在PC端快速下载B站视频,不是唧唧Down,学不会来打我!!!
    查看>>
    AI技术国际领先!一文回顾百度大脑的2020
    查看>>
    登录阿里云Docker认证失败
    查看>>
    ICCV 2021投稿量破万?官方辟谣:只有6千多篇,剩下都是空号......
    查看>>
    CVPR 2021 | 港科大&旷视提出ACON:激活还是不激活?学习自定义激活函数
    查看>>
    EfficientNetV2震撼发布!更小的模型,更快的训练
    查看>>
    python-计网实验二-套接字
    查看>>
    C++学习日记2——多态篇的纯虚函数和抽象类
    查看>>
    F - 数据结构实验之链表四:有序链表的归并
    查看>>
    为什么使用%lf读取double型的值,而用%f进行显示?
    查看>>