如何找到最短的堆栈移动序列以获得目标堆栈?

时间:2012-11-09 01:59:58

标签: python stack

我的任务是编写一些代码,找到将给定起始堆栈带到给定目标堆栈的最短移动序列。我得到了一本书的原始列表,描绘了如何开始堆栈,以及一本书的目标列表,显示了我需要它们的目标顺序。问题在于标准排序算法不起作用,因为它的排序书籍是基于一个人的偏好,而不是任何特定的逻辑。

问题要求您使用的系统如下:从堆栈中的任何位置拉出一本书,一次一个,并将其放在堆栈顶部。因此,如果您有书籍X,Y和Z,您可以选择拉出Y,制作Y,X,Z顺序。

初​​始:

'1984 - George Orwell'
'Moby Dick - Herman Melville'
'To Kill A Mockingbird - Harper Lee'
'Atlas Shrugged - Ayn Rand'
'The Black Cat - Edgar Allen Poe'

目标:

'Atlas Shrugged - Ayn Rand'
'To Kill A Mockingbird - Harper Lee'
'1984 - George Orwell'
'Moby Dick - Herman Melville'
'The Black Cat - Edgar Allen Poe' 

这是作业。但是,我并不是在寻找人为我这样做,因为这会破坏作业的目的。我只是在寻找一些入门的想法或提示,因为我不知道从哪里开始。

注意:我打算将其标记为作业,但标签明确表示不这样做,所以我没有。如果这是错的,请纠正我。

2 个答案:

答案 0 :(得分:4)

好的,主要的问题是你只能登上顶部,但你可以选择任何一本书。你想要提示,而不是方法,所以这里有一些:

  1. 因为你只能站在最顶层,总是开始寻找最难达到的底部
  2. 你显然不需要在正确的地方拉任何书
  3. 您需要以正确的顺序提取现在位于书本上方的所有书籍
  4. 如果您将书籍堆放在顶部,则应按照正确的顺序将它们放在那里
  5. 要将A B G F C E D转换为字母顺序,您可以最佳地拉E,然后是F,如果总是连接到末尾,则选择G.
  6. 我希望这能让你开始,我没有明确表达。

答案 1 :(得分:0)

一个非常简单的算法就是循环遍历堆栈,每次找到并拉出属于底部的下一本书。对于小堆栈,线性搜索就足够了。

在您的示例中,您将在第一次迭代时提取'The Black Cat - Edgar Allen Poe',在第二次迭代时提取'Moby Dick - Herman Melville',在第三次等方式提取'1984 - George Orwell'

这是一个O(n ^ 2)算法。