根据模式进行多栈排序的算法

时间:2016-01-10 17:39:29

标签: algorithm sorting stack

在我的(小)业余时间里,我提出了一个小型的个人项目,作为练习使用新技术的动力(对我来说!),例如Python 3&节点JS。

我想尝试为拼图创建一个解决方案例程,类似于建筑中的河内塔,如下图所示:

Stack Puzzle - sample start and finish

拼图规则

  1. 8个彩色块随机放置在3个堆栈(S1-S3)上,分别具有容量5,3,3。
  2. 大小为3的第四堆栈(S4)是空的,但是用作其他堆栈之间的移动的瞬态存储;例如在S2中将蓝色移到紫色旁边:移动红色[S2 - > S4],移动绿色[S2 - > S4],移动蓝色[S3 - > S4],移动蓝色[S4 - > S2]等。
  3. 随机生成5个块的目标模式,并且必须逐个在堆栈之间移动块(通过S4),直到S1中存在正确的有序块为止,此时S4必须再次为空(最终状态) S2,S3并不重要。)
  4. 请注意,我的插图并不完美,随机情景实际上更具挑战性!但是,想象一下所有堆栈都是在它们的基础上访问的,所以S1(左)的第一个可访问块是黑色的,等等。
  5. 有一些解决方案的提示最终可以编码到算法中,例如:首先关注最后一个块,在这种情况下是紫色。
  6. 算法:

    我一直在寻找最适合的多堆栈排序'基于模式的算法,以避免重新发明轮子,但无法找到任何看似相关的东西,尽管我可能在错误的地方寻找。 河内的经典递归看起来太基本了,而算法如Shunting Yard和Traveling Salesman(以及标准的Bubblesort,Quicksort等) 看起来不太合适(如果我错了,请纠正我!)。

    我的问题:

    任何人都可以建议或推荐一个合适的基础算法,我可以构建或适应解决这个难题吗?它可能需要递归,才能找到正确的路径,但是我确定这种类型的多堆栈或基于模式的排序已经在某个地方完成了吗? 我最终希望通过所需的最少步骤达到最佳效率,但后来才会出现。

    正如我所提到的,最有可能的是我最终会使用Python或JS来实现这一点,但是在这个阶段我们都会欣赏任何想法或片段 - 我希望自己能够开展这项工作以后。

    提前致谢!

    艾伦

1 个答案:

答案 0 :(得分:1)

一种方法是首先将3个未使用的块移动到S4。设置分布,使S1 = 3个块,S2 = 3个块,S3 = 2个块。如果S3有1或2个未使用的块,则需要1或2次移动才能将未使用的块移动到S4。重复S2,进行1到3次移动以移动1到3个未使用的块。最后从S1中删除未使用的块。

现在你有5个街区和3个街区。假设S1有3个块,S2有2个块。属于S1顶部的块可以采取最多的移动结束,这是S1所具有的唯一块。例如,属于S1顶部的块位于S2的顶部。因此,从S2移动2个块到(现在为空)S3,因此键块位于S3的底部。然后将所有3个块从S1移动到S2,然后将键块移动到S1。之后,问题变成了4个块和3个大小为4,3,3的堆栈,这应该不会太困难。完成后,S4中的3个块可以移动到S2或S3。

对于3堆栈排序,多相合并排序是最快的,但所有3个堆栈需要具有相同的大小,因此这里不适用。