前幾天回看自己大一剛開學刷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 為例給出它們的模板 問題描述 乙隻老鼠從迷宮的左上角走到右下角 如下圖 中間不能穿越障礙 陰影部分 任務 給出迷宮的形狀,請你求出老...