2015-06-22 45 views
0

我有問題。我需要爲我的工作完成一些組件的所有可能的構建訂單。舉個簡單的例子,你可以想像一個簡單的樂高的金字塔:獲取給定模型的所有構建訂單。

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

我嘗試某種DFS的,但它沒有工作。最後缺少一些可能性。

任何人都可以幫助我嗎?語言應該是C++,但我只需要一個提示而不是一個完整的算法。

某些信息:這些模型可用作XML文件。在那裏你可以找到所有3個方向(x,y,z)的所有鄰域關係。所有作品都有唯一的名稱/編號。開始沒有定義。構建順序沒有限制。所以你不必完成金字塔的一個層次來開始另一個層次。我知道有很多可能的構建命令。即使是3x3基礎本身也有很多可能性(九個階乘)。但目前並不重要。

我需要幫助。

問候, 埃裏克

+1

我真的不明白你的問題。如果完全沒有對構建順序的限制,那麼就有N個! N件可能的構建訂單。 – user463035818

+0

什麼是DFS?我試圖找出除了「分佈式文件系統」和一家銷售傢俱的公司,我沒有發現任何相關的東西。 – user463035818

+0

@ tobi303 [深度優先搜索](https://en.wikipedia.org/wiki/Depth-first_search)。 –

回答

0

如果不存在任何限制向放置的順序,則存在這些塊可以被放置在訂單的準確n!不同permutations。在這種情況下,一個簡單的解決方案是將所有塊(或者說,他們的id)放入一個向量中,並使用std::next_permutation生成所有排列。

1

首先,將每一層(或「課程」)視爲一個獨立的問題。考慮底部的九塊磚;無視所有其他人,有9!可能的訂單,所以生成這些,請致電P。同樣的4!中間磚的可能訂單是Q。現在我們可以忽略頂部的單個磚塊。

迭代過PQ。鑑於底磚的排序,,以及中磚的排列,q,可能的是,在底部完成之前可能第一次移動q(即鋪設第一中間磚)是可能的,所以我們可以穿插p;對於第一個q的第一個允許時間,迭代第二個允許時間q,並且對於它們中的每一個迭代第三個的允許時間,以此類推。

請注意,頂磚必須始終放在最後。好東西也是。

這足以繼續嗎?

相關問題