解决游戏“Pop it”的算法至少步骤

时间:2012-05-13 22:59:34

标签: algorithm

任何人都可以建议我以最少的步骤解决这个游戏http://puzzle-games.pogo.com/games/poppit的策略。

我的想法是找到一组气球(同色的邻居),这些气球在被移除后会给我们留下最少数量的群体。

然而,我的实施还不够好。我唯一能想到的是收集所有气球组,并检查每组如果我删除它会留下多少组。这当然是非常繁重的操作,因为它包括在我删除组然后恢复原始订单后重新排列气球。

如果有人想出更好的方法来实现我的算法或完全解决问题的方法,我会非常感激!

2 个答案:

答案 0 :(得分:1)

此游戏是Same Game的另一个版本。关于是否存在最优解的问题在this paper中显示为NP完全。这意味着一般来说, 最佳解决方案需要指数时间才能找到。另一方面,如果您将问题转化为布尔可满足性问题的实例,您可以使用SAT solver来比特定方法更快地解决问题。

答案 1 :(得分:0)

您提到的是Backtracking方法。你弹出气球组,直到你不能再这样做,然后你撤消最后一步并尝试别的东西。维基百科对此的解释比以往任何时候都要好。

虽然这听起来很重,但我现在猜测计算机应该可以很快解决你的问题。

至于实现,它基于一个递归函数(一个自己调用的函数),伪代码看起来像这样:

void main()
{
    setupBoard();
    if(Try())
        print("Found Solution");
}

boolean Try()
{
   if(noballonsLeft)
       return true; //Found solution!
   foreach(Move move in getPossibleMoves())
   {
       doMove(move);
       if(Try())
           return true; //This try found a solution!
       undoMove(move);
   }
   return false; //No solutions found
}

这将找到问题的 a 解决方案,扩展这个以找到最佳解决方案应该没问题;)