CF1970C2 Game on Tree (Medium) 题解
0x00 题目大意
给出一棵树,在一个点上放一个棋子,两人轮流移动棋子到相邻位置,不可重复经过某个点,两人决策最优,问谁获胜。
0x01 初步分析
看一下样例,画个图分析一下:
然后看一下可以怎样移动:
发现每一条路径都去往叶子节点,显而易见,每个叶子节点的状态是确定的:
这个状态可以很快求出,接下来研究如何向上转移。
0x02 深入分析
由于叶子节点状态已知,所以考虑自底向上分析。
在这里,每一个节点上由谁选择(移到下一个点)很重要,我们用绿色字体标出每个节点上由谁选择:
可以看出,由谁选择取决于节点的深度。
易得,在最优决策中,总是要选择可以使得自己获胜的点,如果没有,则在这一点上出发对方获胜,否则自己获胜。
于是可以自底向上标出每一个点上的获胜者:
这时看一看起始节点上谁获胜就行了。
0x03 具体实现
在代码中,可以如图中用字符表示状态(这样直观但代码量大),但更推荐用布尔值来实现,这样可以把判断获胜者的运算转化为深度模 和逻辑运算,具体的写法可以自己琢磨。
求获胜者的步骤可以直接写在搜索的回溯部分,这样便于实现。
0x04 正确代码
建议略过这部分,自己思考。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 shicj's blog!
评论