简介
题目链接 LeetCode 294. Flip Game II
本题的标签是Backtracking
和minimax
,其中minimax
是一种英文的缩写,可以扩展为minimize maximum
,进一步可以翻译为“极小化极大算法”。这种算法一般用于零和游戏(也就是赢家通吃,输家全输的游戏),这里minimax
指的是,使最大可能损失(maximum)最小化(minimize)的过程。
想了解更多minimax
的题目,可以从尼姆游戏 LeetCode 292. Nim Game开始尝试,这是一道Easy
题。
和很多LeetCode上面的题一样,本题的难点在于理解题目,一起来看看。
注意:文章中一切注解皆为Python代码
理解题目
这个游戏规则如下:给一个字符串,里面全是+
或者-
,两个人轮流翻++
,只能把++
翻成--
,最后没得翻的人就输了。
题目要算的是,有没有一种走法能让先手的人确保胜利guarantee a win
,如果有的话返回True
,没有就返回False
。
题目剖析+思考过程
这题难点就难在如何理解guarantee a win
这里,如果没有理解透彻可能就卡住了。
没理解透的人可能会这么想:
- 怎么才能让先手获胜呢?
- 先手走了之后,我怎么知道后手怎么走?
- 后手那么多种走法,怎么才能确保先手获胜?
但是稍微再努力想一想,就能得到如下理解:
- 题目就是在问:找出至少一种方法,使得不论后手怎么走,先手都能赢
这下,算是理解了,但是怎么实现呢?你一步,我一步的?难道要把先手/后手的信息加入到实现的函数中吗?
- 答:你可以这么做,但并不是必须的。
根据之前的理解,作为先手(1),我们要了解后手(2)所有的走法,并确保他们全都会输,这样先手(1)才可以稳赢(guarantee a win)。那此时,从后手(2)的视角看,除非先手之后(3)的走法稳赢,不然后手(2)不会必输;这样的逻辑一直