题解:P2540 [NOIP2015 提高组] 斗地主 加强版
首先这个题对于花色没关系,所以这里直接忽略花色影响。
以下用「被三带」表示此牌是三张相同的牌带的单牌或一对,「被四带」同理。
考虑这个题怎么做,结合迄今为止所有「斗地主」题目,含 PKUSC/PKUWC 的题目,考虑搜索并剪枝。
分别考虑每种基础牌型,即单、双、三、四(炸)。
单
单牌会引出「被三带」和「顺子」以及「被四带」三种牌型。
单牌、「被三带」和「被四带」的处理是简单的,「被四带」只是在「被三带」的基础上加上了再找一张单牌的过程。「顺子」稍复杂,因为我们在 dfs 的过程中是把点数小于当前搜索的牌的所有牌全部耗光才会进入当前牌的搜索,所以我们考虑直接向后枚举,考虑最短的五顺子,逐渐增大长度并判断是否可行。
实现其实也是简单的,但是注意枚举完之后请注意要做所谓的「还原现场」。
双
一对会引出「被三带」、「被四带」和「顺子」三种牌型。
同上,注意判王炸的情况。
三
会引出「三带」和「顺子」两种牌型。
注意这里的三带是主动的,故可以带单或者带对,同时注意不能带对王。
四
会引出「四带」一种牌型,注意带的牌可以是任意两张单牌或者任意两对(同样不能带对王)。
剪枝
显然是有最优性剪枝的,如果当前步数大于最优解就停止。
还可以记录剩余牌数,如果打光了就停止(好像是废话)。
大概思路就是这样,只需要从四个主干牌型去引伸出其它分支牌型,就避免了无头绪的搜索过程。