一次分拣两个箱子

时间:2014-10-18 18:21:21

标签: algorithm sorting

在只有4个垃圾箱的情况下,我对以下问题感到困惑。我可以做6或8而不是4.此外,有人可以帮我提出一个通用的算法吗?

你有n个箱子(以B A B A ......的交替顺序排列)你可以一次移动2个,并且有2个槽位。对它们进行排序,以便最后所有“A”箱都留在所有“B”箱中。它们都应该相邻,即最后没有间隙。例如:

_ _ _ _ B A B A

由于

编辑:是的,你必须将两个相邻的箱子一次移动到两个相邻的位置。

编辑2:不,你不能转置垃圾箱。这是一个有6个箱子的例子:

_ _ _ _ _ _ B A B A B A

_ _ _ _ A B B _ _ A B A

_ _ _ _ A B B B A A _ _

_ _ A A B B B _ _ _ _

1 个答案:

答案 0 :(得分:0)

直接广度优先搜索4箱案件的可到达位置表明它实际上无法解决。这是粗略的伪代码,因此您可以尝试为自己编写:

todo_queue = ["____BABA", []]
path_to_position = {}
while things in todo_queue:
    (position, path) = todo_queue.next()
    if position in path_to_position:
        continue # We've been here before.
    if position is success:
        print path
        EXIT HERE
    for my move in possible_moves(position):
        todo_queue.add([position after move, path + [move]])

对于一般解决方案,只需对广泛优先搜索6,8,10和12箱的情况作为特殊情况就足够了。对于任何更大的偶数数字箱,您可以解决其中一个以创建解决方案的中间部分,然后解决8个块。然后您可以轻松地移动并将这些已解锁的块逐对重新排列到最终解决方案。