回溯法求解消消乐实验

回溯法求解消消乐问题

实验概述

  1. 掌握回溯法设计思想。

  2. 掌握消消乐问题的回溯法解法。

《开心消消乐》是一款乐元素研发的三消类休闲游戏。游戏中消除的对象为小动物的头像,包括小浣熊、小狐狸、小青蛙和小鸡等动物头像。玩家通过移动动物头像位置凑够同行/同列3个或3个以上即可消除。

实验思路

规则拆解

消除块:就是对这个块划十字(下图情况为举例,实际上不会有这种情况)。
回溯法求解消消乐实验_第1张图片
向下塌陷:消除时记录下最左、最右、最下边消除的块。从最下往上、从最左最右遍历,如果(x, y)处没有块,向上找到第一个块交换。塌陷后检查塌下来的块有无可以被消除的,循环。
回溯法求解消消乐实验_第2张图片
检查:检查同样只要检查最左到最右、最下到顶这么一小块,因为只有这个范围内的塌陷了,要有能继续消的也在这个范围。
回溯法求解消消乐实验_第3张图片
交换两块:交换两块,然后尝试消去(两块都尝试),如果能消去就塌陷、检查。

回溯

回溯没啥好说的,把树画出来一看就明白了。
回溯法求解消消乐实验_第4张图片

剪枝

  1. 存下遍历过的每一张图

    用map存下<图, 分>对,对当前的图,拿出map中对应图,若当前得分小于map中存取的分,剪枝;否则更新分值。

    注意这种方法可能不能得到最优解,准确率在99%左右(请自己测一下),原因如下:

    如果经过x步到达了第n个地图状态,且此时为该状态最大分数scoreX,更新了map[n] = scoreX。但是或许会存在当某一次到达n状态时,其分数scoreY < scoreX,但步数y < x,在有步数限制的情况下,未来将有机会在分数上超过前者。

  2. 概率剪枝

    对m*n的随机棋盘做多次无剪枝回溯,得到k步得分平均数据。则在当前棋盘,若最大得分为p,步数限制为maxStep,当前第k步已得q分,如果q + (maxStep步平均分- 当前步数平均分) < p,剪掉。

    为提升准确率,剪枝条件改为q + (maxStep步平均分 -当前步数平均分) < w * p。可见w越小准确率越高,但速度会变慢。

    这种剪枝当然也会有概率不能得到最优解,准确率视w而不同(请自测)。

图形化

贴个Qt版图形化的github链接(欢迎改进):https://github.com/StephenArk30/happyelements-xxl

你可能感兴趣的:(算法)