博客
关于我
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/

    你可能感兴趣的文章
    纯干货!深度分析一下AQS原理,一文全懂
    查看>>
    腾讯Java面试题,从基础到源码统统帮你搞定,2年以上经验必看
    查看>>
    字节跳动算法工程师总结:腾讯+字节+阿里面经真题汇总,含面试题+答案
    查看>>
    LeetCode 22. 括号生成
    查看>>
    (二)MyBatis学习笔记——使用映射配置文件进行CRUD、核心配置文件使用
    查看>>
    LeetCode 76. 最小覆盖子串
    查看>>
    架构 -- rsync补充02
    查看>>
    shell基础 - 03
    查看>>
    第七课时logback日志框架介绍及应用
    查看>>
    第十一课时通讯录列表前后端调用
    查看>>
    java注解完整实例
    查看>>
    SpringBoot Http getMapping、postMaping等详细解析
    查看>>
    6.4 jmeter基础知识--变量
    查看>>
    6.6 jmeter基础—系统日志
    查看>>
    10 测试脚本结果分析
    查看>>
    先验概率,后验概率,似然函数,贝叶斯公式
    查看>>
    python初学者容易犯的错误
    查看>>
    github资源下载assets中的各种格式
    查看>>
    ubuntu中添加截图和录屏快捷键
    查看>>
    基于libVLC的视频播放器之四:直接使用libVLC
    查看>>