
Nim POJ - 2068
mex函数:从集合中找出最小的不包含的非负整数。例如,mex{0,1,2}=3。 对于任何状态x,SG(x) = mex{SG(y)},其中y是所有可能后继状态。
n = 0:没有石子可取,此时是必败点,SG(0) = 0。 n = 1:当前玩家可以取走1块石子,直接赢,SG(1) = 1。 n = 2:当前玩家可以取走2块石子,直接赢,SG(2) = 1。 n = 3:无论当前玩家取1、3块石子,对方都能在下一轮取走剩下的石子,对方胜利。因此,SG(3) = 0。
初始化 递归函数 对于每一个状态,尝试所有可能的取法(取1到 mex函数则从所有可能的后继SG值中找出最小的未被使用的值。
发布日期:2021-05-10 20:50:06
浏览次数:16
分类:精选文章
本文共 896 字,大约阅读时间需要 2 分钟。
在分析多人尼姆游戏时,我们需要扩展传统尼姆游戏的规则,将参赛人数拓展至两个队伍。每支队伍有固定数量的队员交替入座,单次能够取走若干块石头,取走后一块石头的队伍则失败。我们需要判断第一支队伍是否拥有必胜策略。
分析与理解
我们将采用记忆化搜索的方法,记录轮到第几人时剩余多少块石子的状态,从而分析游戏的胜负规律。
必胜点与必败点
- 必败点(P点):指在双方都采取理想策略的情况下,当前玩家无法获胜的状态。
- 必胜点(N点):指在双方都采取理想策略的情况下,当前玩家能够获胜的状态。
游戏的SG函数(Sprague-Grundy函数)将帮助我们分析这些状态。SG函数的定义如下:
终局状态(如游戏结束)对应SG值0,是一个必败点。
游戏分析
让我们从简单的案例入手,逐步分析SG函数的值。
通过继续分析,我们可以发现SG值呈现出周期性规律:SG(n) = 0,1,1,0,1,1,0,...。
代码实现
以下是用C语言实现SG函数的代码。dp
数组用于保存中间结果,dfs
函数通过记忆化搜索计算SG值。代码逻辑如下:
dp
数组,标记已计算的状态。dfs
计算当前状态res
的SG值,递归终止条件为res == 0
。res
块石子),递归计算后继状态的SG值。结论
通过以上分析,可以看出第一支队伍在多人尼姆游戏中是具有必胜策略的。通过合理安排每一轮的取石数量,第一支队伍能够迫使对方进入必败状态,最终确保胜利。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月18日 06时30分32秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
leetcode题解102-二叉树的层序遍历
2023-01-31
leetcode题解102-翻转二叉树
2023-01-31
leetcode题解104- 二叉树的最大深度
2023-01-31
leetcode题解108-将有序数组转换为二叉排序树
2023-01-31
leetcode题解118-杨辉三角
2023-01-31
leetcode题解119-杨辉三角II
2023-01-31
leetcode题解131-分割回文串
2023-01-31
leetcode题解132-分割回文串 II
2023-01-31
leetcode题解136-只出现一次的数字
2023-01-31
leetcode题解14-最长公共前缀
2023-01-31
leetcode题解15-三数之和(双指针经典)
2023-01-31
leetcode题解151-翻转字符串里的单词
2023-01-31
leetcode题解153-寻找旋转排序数组的最小值
2023-01-31
leetcode题解162-寻找峰值
2023-01-31
leetcode题解167-两数之和 II - 输入有序数组
2023-01-31
leetcode题解172-阶乘后的零
2023-01-31