基於陣列的深度優先搜尋二例

2021-09-30 04:56:58 字數 790 閱讀 7196

寫了程式一定要總結。

兩個都是由別人的問題引起的。

問題1:

巧排數字,將1,2,...,19,20這20個數字排成一排,使得相鄰的兩個數字之和為乙個素數,且首尾兩數字之和也為乙個素數。程式設計列印出所有的排法

列舉絕對要死人。。。

指數級別的時間複雜度

這裡採用深度優先搜尋,

程式中採用兩個陣列,

乙個是resultarray,結果陣列,標識當前結果

另乙個是flagarray,狀態陣列,標識哪些數字已經被選取。

因為根據題意,這個結果是迴圈的,所以直接把結果陣列的第一位置為1,

然後從第二位開始,進行深度優先搜尋。

程式中有乙個變數locationindex,標識當前結果陣列中已經存在選取好數字的位數。

在while迴圈中對locationindex有相應的操作邏輯,迴圈退出條件是locationindex == 0

程式中沒有注釋,有點暈。。。

上**:

問題2:

給出1-20的20個整數,問任意多個不重複的數相加等於20的組合有多少種?

注:1+19=20;19+1=20 是一種組合!

注意任意多個這個條件,

有人說暴力列舉也能出來,對於這個問題來說,暴力列舉的時間複雜度也能接受。。。

因為是任意多個,所以while迴圈的退出條件有所改變,

變成了resultarray[0]==20

因為列舉到20

就可以認定程式可以退出終止了

其實這個**裡面還可以剪枝,繼續優化的。

上**:

深度優先搜尋(二)

用深度優先搜尋,直接套用模板就好。注意mark函式和unmark函式 mark函式把格仔中的值 1,其中unmark函式,把格仔中的值 1,為什麼不是直接改變值,是因為有可能多個皇后都攻擊那乙個位置,如果直接改變值,那麼可能會影響某個皇后的攻擊範圍。include include using nam...

深度優先dfs與廣度bfs優先搜尋總結 例題

深度優先遍歷 dfs 是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。簡而言之 不撞南牆不回頭 模板如下 void dfs int t t代表目前dfs的...

樹的廣度優先搜尋(BFS),深度優先搜尋 DFS

bfs breadth first search,廣度優先搜尋 dfs depth first search,深度優先搜尋 如圖,a節點的下一級元素為b節點和c節點,b節點的下一級元素為d節點和e節點,c節點的下一級元素為f節點和g節點。bfs優先遍歷當前節點下一級節點的同級元素,即若當前節點為a節...