有四个堆栈。在第一个堆栈上,以随机顺序存在n个数字1,2,... n。其他三个堆栈都是空的。目标是在给定第一个堆栈的状态的情况下确定是否可以将所有元素移动到最后一个堆栈以便对它们进行排序。允许的移动将元素从第一堆栈移动到第二或第三堆栈,并且从第二或第三堆栈移动到第四堆栈(1> 2,1> 3,2> 4,3> 4)。与河内的塔不同,较大的元素可以位于较小的塔上。
我应该写一个程序来做这个,但我不能想出一个算法。请帮助。
答案 0 :(得分:2)
Tower of Hanoi - Four Pegs and Beyond:使用Frame-Stewart算法,或将游戏状态表示为无向图,并运行最短路径查找算法,如Dijkstra's algorithm。
答案 1 :(得分:1)
缺乏进一步的洞察力,我会将其作为图搜索。
每个游戏状态都是一堆堆栈。注意,为了平等, 第二和第三堆栈是可交换的,所以应该是以下 考虑相同:
((1 3 5)
(2 4)
(7 9)
(0))
((1 3 5)
(7 9)
(2 4)
(0))
该图是有向无环图。顶点是游戏状态, 并且边缘移动。
算法是从给定的第一个开始创建此图 国家,但修剪所有不能导致目标状态的国家,并且 团结所有相同的状态(为此,你需要去 广度优先)。
无法达到目标状态的国家是那些州
可能还有其他限制。特别是,我不确定 是否没有办法确定订单的结果 直接第一个堆栈(这将使这个算法 多余)。
答案 2 :(得分:0)
我会根据任何堆栈中未排序元素的数量使用带有启发式的A *搜索,堆栈底部附近的未排序元素是启发式的最高惩罚。
答案 3 :(得分:0)
这相当于一个更简单的问题。想象一下两个堆栈。第一个具有相同的N个磁盘随机堆栈,第二个是空的。使用以下规则将磁盘从第一个堆栈逐个移动到第二个堆栈:
这个问题没有选择,而且是O(n)。
这两个问题是等价的,因为你必须保留一个中间堆栈(比方说,第二个)来堆叠最小的磁盘,直到最后。因此,您可以使用单个wastbasket替换该堆栈和第四个堆栈,您可以始终删除已经播放的最大或最小磁盘。这留下了一个堆栈(第三个)仍然存在冲突。
修改
的Ack!感谢RafałFowgird发现我的错误。我会尝试修复它,但直到/除非我这种方法毫无价值。