从给定模型获取所有构建订单。

时间:2015-06-22 15:11:09

标签: c++ algorithm

我有问题。我需要为我的工作所有可能的构建订单的一些组件。举个简单的例子,您可以想象一个简单的乐高金字塔:

http://i.stack.imgur.com/Y7Lcr.jpg

我尝试了某种DFS,但没有成功。最后遗漏了一些可能性。

任何人都可以帮助我吗?语言应该是C ++,但我只需要提示而不是完整的算法。

一些信息:模型以XML文件的形式提供。在那里你可以找到所有3个方向(x,y,z)的所有邻域关系。所有作品都有唯一的名称/ ID。开头没有定义。构建顺序没有限制。因此,您无需完成金字塔的一个级别即可启动另一个级别。我知道有很多可能的构建订单。即使是3x3-base本身也有很多可能性(九个因子)。但此刻并不重要。

我需要帮助。

问候, 埃里克

2 个答案:

答案 0 :(得分:1)

首先,将每一层(或"当然")视为一个独立的问题。考虑底部的九块砖;忽略所有其他人,有9个!可能的订单,所以生成那些,称之为 P 。同样是4!中间砖的可能订单是 Q 。我们现在可以忽略顶部的单块砖。

迭代 P Q 。给定底砖, p 以及中间砖的排序 q ,可能是 q 的第一步(即在底部完成之前,可以铺设第一个中级砖块,因此我们可以通过 p 的移动来散布该移动;对于第一个 q 的每个允许时间,迭代 q 的第二个允许时间,并且对于每个允许时间迭代第三个的允许时间,并且等等。

请注意,顶部砖必须始终放在最后。好的,也是。

这还够继续吗?

答案 1 :(得分:0)

如果对展示位置的顺序没有任何限制,则可以放置n!个不同permutations个订单的订单{{1}} 。在这种情况下,一个简单的解决方案是将所有块(或者更确切地说,它们的id)放入一个向量中,并使用std::next_permutation生成所有排列。