尼姆变异游戏策略-StoneGameStrategist-SRM309
Strategy for a Nim variation game - StoneGameStrategist - SRM 309
我对博弈论还很陌生,只了解正常的尼姆游戏,在这种游戏中,你可以在没有条件的情况下从堆里移除石头,最后一个移除石头的玩家获胜。但后来我在阅读Topcoder上的博弈论教程时遇到了一个好问题。要点如下:
你和一个朋友正在玩一个游戏,你轮流从成堆的石头中取出石头。最初,每个桩的石头数量至少与左边的桩一样多。此属性必须在整个游戏过程中保持。每转一圈,从一堆石头中取出一块或多块石头。你和你的朋友轮流转弯,直到无法做出有效的动作。最后一个出手的玩家赢得了比赛。请注意,如果从一堆石头中移除所有石头,它仍然被视为一堆。如果你做出了"获胜的举动",那么无论你的朋友做什么,你最终都能获胜,那么你就被认为是做出了"胜利的举动"。你会得到一个int[]桩,从左到右代表每一桩中的石头数量。该你动了。找到一个获胜的动作,并将其作为字符串返回,格式为"TAKE s STONES FROM PILE k"(仅为清晰起见,引号),其中s和k(一个基于0的索引)都是没有前导零的整数。如果有多个获胜动作,请选择使s最小化的一个。如果仍有平局,请选择将k最小化的那个。如果没有获胜动作,则返回字符串"YOU LOSE"(仅为清晰起见,引号)。
这里的石头移除有一个条件,即你需要保持整体的非递减顺序,这正成为我制定逻辑的障碍。我试着阅读了这篇社论,但不幸的是,我无法理解它背后的想法。有人能用更简单的术语解释解决方案吗?
社论没有解释如何解决尼姆的原始游戏,只提供了维基百科页面的链接(在那里可以找到解决方案)。
这篇社论只是解释了如何将Topcoder问题映射到Nim:的常规游戏中
首先,游戏可以转换为桩与原始桩之间存在差异的游戏(因此3 6 6的示例变成3 3 0)。
然后桩的顺序颠倒(因此示例变为0 3 3)。
然后,这个新游戏中的一个动作变成了一个分两步的过程:从一堆石头中取出石头,并将其添加到上一堆(在本例中,获胜的动作从最后一堆石头取3,并将它们添加到中间一堆石头,变为0 6 0)。
然后,如果你只看奇数桩(#1、#3、#5等),你就得到了尼姆的常规游戏,并且可以在上面应用一个有记录的算法(所以0 3 3与尼姆的0 3位置相同)。
因此,给出的解释是:
- C++17中的并行执行策略
- 运行时执行策略不同
- 编译器上的策略数据结构不起作用
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- C++ 运算符修改/元编程策略,用于不那么冗长的语法
- 使用 Qt5 SQL 进行异步数据库访问的策略
- C++基于策略的设计:继承与组合
- 当PSO细粒度策略对使用AdsGetObject MSDN API的Windows操作系统生效时,如何获取用户密码到期日
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 如何实例化基于输入的策略模式
- 使用策略模式设计软件时出现的问题
- 在发送源代码时省略未使用的boost src文件的策略
- 使用 redis 进行日志缓存:是否可以创建逐出到 PostgreSQL 的逐出策略?
- CMAKE:前导或尾随空格(策略CMP0004)
- 转换非常长的字符串文本C++以满足最大行长策略
- 在插入顺序已知时填充 Eigen3 稀疏矩阵的策略
- C++ 中的执行策略
- 动态控制C++的执行策略类型