最基礎的深度優化搜尋 dfs 題目

2021-10-03 08:50:30 字數 1454 閱讀 2508

前幾天回看自己大一剛開學刷oj時遇到的一道迴圈類題目,結合這個假期自已學的一點點演算法知識,重新寫了段**,也算是加深自己對dfs的理解了。

題目描述

將1,2,⋯,9共9個數分成3組,分別組成3個三位數,且使這3個三位數構成1:2:3的比例,試求出所有滿足條件的3個三位數。

從演算法層面上說 這是一道最基礎的深度優先搜尋的題目。

首先 我們可以將這道題近似為「盒子放卡片」問題

有這樣9個盒子,標號為1~9的卡片,每個盒子只能放一張卡片。

將卡片放入盒子中,直到把所有盒子都裝滿,如果此時前三個盒子組成的a:中間

三個盒子組成的b:後三個盒子組成的數c為1:2:3時,將這三個數輸出。

我們用book陣列來標記每張卡片是否已經使用過 用num陣列表示盒子

我們來模擬一下放卡片的順序123456789 213456789 312456789……

每次放卡片,我們都從目前能放的卡片中找到最小的那張放進去,直到所有情況

都試過。

那麼假設我們站在第step個盒子面前,我們需要從頭看看自己手上還有什麼卡片可

以用,從小開始,如果找到了i可以用(即book[i]==0),那我們就將這張卡片放進

去(num[step]=i;book[i]=1)。放完第step個盒子以後,我們就來放第step+1個盒

子,即遞迴呼叫dfs(step+1)一直呼叫到step==10,此時呢,你站在第10個盒子

面前,這意味著你已經將前面的9個盒子都裝滿了,於是就可以判斷a,b,c的關係,

如果符合條件,則將這三個數輸出。我們輸出一次以後,需要再返回上一步,再

次嘗試新的卡片,上一次最小的可用卡片是i,那我們這次就用i+1,在呼叫完

dfs(step+1)之後,第step個盒子裡面還是裝著i,所以我們應該先將i拿出來(即

book[i]

=0),在進行下一次迴圈。

最後主函式只需要從第1個箱子進行放,就是dfs(1)就可以了。

所謂深度優先搜尋,簡單來說,就是先沿著一條路走,走到底,再返回上一步,

選擇另外一條路,繼續走到底,直至走過所有節點。

下面是**

#include

using

namespace std;

int book[10]

;int num[10]

;void

dfs(

int step)

for(

int i =

1; i <=

9; i++)}

}int

main

(void

)

大一新生入門,第一次寫,如果有漏洞或者理解不到位,往各位見諒,並希望有大佬能夠提出建議,謝謝。

DFS 深度優化搜尋

類似於樹的先根遍歷。就是不撞南牆不回頭 模板一 dfs dep,dep代表目前dfs的深度 dfs dep 1,列舉下一種情況 模板二 dfs dep,1.從圖中v0出發,訪問v0。2.找出v0的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直至剛訪問過的頂點沒有未被訪問的鄰接點...

最基礎的窮竭(深度)搜尋問題 python

窮竭搜尋是將所有的可能性羅列出來,在其中尋找答案的方法 深度搜尋的優化技巧 題目 給定整數a1,a2,an,判斷是否可以從中選出若干數,使它們的和恰好為k 思路 該題就是從第乙個數開始遍歷所有的可能,對於第乙個數,可以選擇加與不加兩種可能,第二數也可以選擇加與不加兩種可能,兩者進行組合進行組合有2 ...

基礎演算法 深度優先搜尋DFS與廣度優先搜尋BFS

深搜 depth first search 和廣搜 breadth first search 是兩種基本搜尋演算法,均採用窮舉策略 下面以老鼠走迷宮 maze.cpp 為例給出它們的模板 問題描述 乙隻老鼠從迷宮的左上角走到右下角 如下圖 中間不能穿越障礙 陰影部分 任務 給出迷宮的形狀,請你求出老...