深度優化搜素(dfs

2021-10-12 00:24:16 字數 1388 閱讀 6107

如果我們想輸出乙個數的全排列,eg:1,2,3 的全排列

那麼就有123,132,213,231,312,321,這六種。

那如何用**實現呢?

for

(int a =

1; a <=

3; a++)}

}

暴力列舉是一種,但是如果數字編的更多呢?

如1,2,3,4,5,6,7,8,9呢?

如果我們還是乙個乙個列舉出來,別說計算機你也不願意。

它的基本形式是:

void

dfs(

int step)

//返回;

}

再回到剛才的問題

給出了n個數(假設是三個)

那麼我們可以看做,將三張牌放入三個盒子,一共有多少種不同的擺法;

首先我們定義乙個陣列來表示牌,乙個陣列來判斷是否目前這個牌有沒有在手上,

int book[10],a[10];

如果目前這個盒子沒有牌

依次列舉下去,將手上的安裝(先1,再2,後3)放入盒子

for

(int i =

1; i <= n; i++

)}

接著,我們以相同的方法來處理下乙個盒子(函式的遞迴呼叫)

void

dfs(

int step)

}return;

}

這樣,一輪下來,我們已經得到乙個a陣列,a[1]==1,a[2]==2,a[3]==3

這時候,我們依次退回上乙個盒子,拿回剛才放進去的牌,

當退到第二個盒子拿回2的時候,我們手上現在就有了兩張牌2,3.由於剛才

我們在第二個盒子放的是2,那麼,我們根據上面所寫的,(先1,再2,後3)這時,第二個盒子就乙個放入3.第三個盒子放入2.

此時,我們又得到乙個a陣列,a[1]==1,a[2]==3,a[3]==2.

void

dfs(

int step)

}return;

}

我們依次將a陣列列印出來,就得到他的全排序

完整**如下

#include

int a[10]

, book[10]

, n;

void

dfs(

int step)

printf

("\n");

return;}

for(

int i =

1; i <= n; i++)}

return;}

intmain()

深度搜素 搜尋巢狀

搜尋問題,擴充套件節點的時候會iterate乙個link集合,一般就是乙個for 迴圈,但有的時候,這個集合並不能直接得到,而是另乙個搜尋問題,比如n個數分k組問題的一種解法是 問題分成k個步驟,每個步驟確定乙個組,具體乙個組可分的方案的candidate集合就不是直接可以用for來iterate的...

使用深度優先搜素(DFS)實現馬踏棋盤

感覺想學會dfs說到底最重要的也就是弄懂遞迴怎麼用 include define x 8 define y 8 int chess x y 棋盤 bool nextxy int x,int y,int count break case1 if x 2 x 1 y 1 y 1 chess x 2 y ...

深度優先搜素及題目

1.搜尋是指已知初始狀態和目標狀態,對問題的中間狀態進行列舉的遍歷的一種演算法,通俗的講,搜尋就是比較複雜的列舉。2.深度優先搜尋是按照深度的方式進行搜尋,就是把所有可行的方案都列舉出來,不斷的去嘗試,直到找到問題的解。設想你在乙個迷宮裡面,當我們在起點時,總要通過各種岔路口才能找到迷宮的終點,那麼...