考虑一个类似于 Tower Solitaire、Tripeaks 或 Fairway Solitaire 的纸牌游戏:桌子上有一些立即可用的牌,每张牌下面可能会盖着其他牌(阻止它们被玩)。你有一张“基础”牌,如果一张牌与你的基础牌相差一点点,你就可以从桌子上移走一张牌,并将其作为新的基础牌。当你无法从桌子上打出一张牌时,你只能从有限的替换牌中抽取,因此通常要尽可能打出最长的牌序列。
首先,为了方便找到解决方案,你将如何表示棋盘?其次,你将使用什么算法来查找最长可玩序列?
例如:
我想这应该表示为某种有向图。你会从 3 和 2 到 4a,从 2 和 4b 到 5 有边,但是在 3 和 2 之间以及在 4a 和 5 之间也有边吗?如果是这样,它们可以按任意顺序播放的事实是否形成了图中的循环,阻止你使用高效的“最长路径”算法?(我相信,如果图包含循环,则在图中查找最长路径是 NP 完全的。)
首先,为了方便找到解决方案,你将如何表示棋盘?其次,你将使用什么算法来查找最长可玩序列?
例如:
-4a- -5- -3- -2- -4b-底部的牌会阻挡顶部的牌被移除:在 3 和 2 都被移除之前,你不能移除 4a。假设你的起始牌是一张 A 牌,那么这里的最佳打法是 2, 3, 4b, 5, 4a。(你也可以选择 2, 3, 4a,但那不是最好的。)
我想这应该表示为某种有向图。你会从 3 和 2 到 4a,从 2 和 4b 到 5 有边,但是在 3 和 2 之间以及在 4a 和 5 之间也有边吗?如果是这样,它们可以按任意顺序播放的事实是否形成了图中的循环,阻止你使用高效的“最长路径”算法?(我相信,如果图包含循环,则在图中查找最长路径是 NP 完全的。)