演算法筆記之深度優先搜尋 DFS

2021-09-12 21:54:25 字數 2368 閱讀 5421

~~~~

由於各種筆試、面試都有演算法程式設計題,總感覺對於演算法和資料結構比較心虛。。最近開始刷一些演算法題,複習一下資料結構以及演算法的相關知識。過程中記錄一下知識點,聊勝於無。

~~~~

兩個問題如下:

一共有10塊積木,每個積木上有乙個數字,0~9。

搭積木規則:

每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。

最後搭成4層的金字塔形,必須用完所有的積木。

下面是兩種合格的搭法:

01 2

3 4 5

6 7 8 9

03 1

7 5 2

9 8 6 4

請你計算這樣的搭法一共有多少種?

考慮如下四則運算:

□ + □ = □

□ - □ = □

□ × □ = □

□ ÷ □ = □

每個方塊代表1~13中的某乙個數字,但不能重複。

比如: 6 + 7 = 13

9 - 8 = 1

3 * 4 = 12

10 / 2 = 5

以及:

7 + 6 = 13

9 - 8 = 1

3 * 4 = 12

10 / 2 = 5

就算兩種解法。(加法,乘法交換律後算不同的方案)

你一共找到了多少種方案?

~~~~

上面兩道題的解題思想都是一樣的,基本思路是進行全排列,然後找出所有滿足要求的解。可以用蠻力法窮舉的,但是顯然會面臨超時問題。

~~~~

最重要的就是選好全排列的資料結構以及有效地搜尋演算法,有如下解題思路:

全排列問題可以看做一棵樹,樹的第i層是第i個位置的所有取值可能,每個節點可能是0-9中的所有數,因此可以得到乙個10n

10^n

10n(n個位置的全排列)個葉子大小的樹;

考慮題目條件,①不能重複;②滿足一定的條件;

使用dfs搜尋,終止條件為全排列的長度;同時定義全域性變數,記錄滿足條件的排列。

~~~~

其實,上面的思想,只是使用dfs在全排列表示的樹中進行搜尋,搜尋空間仍然為10n

10^n

10n。

~~~~

考慮題目的要求,可以在搜尋過程中使用剪枝的思想。

~~~~

比如四則運算要滿足條件,那麼當搜搜第3、6、9、12個數時,可以判斷當前數與前面兩個數是否滿足運算條件,如果不滿足,則就放棄繼續向下搜尋。

public

class

seventhpa

public

static

void

dfs(

int idx)

if(idx ==13)

//return;

}for

(int i =

0; i <=

12; i++)}

}/**

* 剪枝判斷

*/public

static

boolean

check

(int i)

if(i >=6&&

(temps[3]

- temps[4]

!= temps[5]

))if(i >=9&&

(temps[6]

* temps[7]

!= temps[8]

))if(i >=

12&&

(temps[9]

/(float

) temps[10]

!= temps[11]

))return

true;}

/** * 搜尋結果判斷

*/public

static

boolean

judge()

if(temps[3]

- temps[4]

!= temps[5]

)if(temps[6]

* temps[7]

!= temps[8]

)if(temps[9]

/(float

) temps[10]

!= temps[11]

)return

true;}

}

void

dfs(

int idx)

void

main()

演算法筆記 深度優先搜尋 DFS

深度優先搜尋 depth first search,簡稱深搜 是一種極其常用的演算法,簡單來說,符合以下策略的就可以稱為深度優先搜尋。在圖中行走,沒有走過的點稱為 新點 所有走過的點稱為 舊點 開始時所有的點都是新點,從任意節點1出發,走向任意乙個新節點,同時將新節點標記為舊節點,然後重複此步驟。如...

《演算法筆記》深度優先搜尋DFS

問題 有n件物品,每件重量為w i 價值為c i 放進容量為v的揹包中。問 能放進揹包的物品的最大價值?分析 1.每件物品 選 不選,兩種狀態 迷宮的岔道口 2.超過v,邊界 迷宮的死胡同 3.到達邊界,返回最近的岔道口 4.dfs需要記錄 5.兩種轉移狀態 dfs index 1,sumw w i...

深度優先搜尋演算法(DFS)

1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...