如果我們想輸出乙個數的全排列,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.深度優先搜尋是按照深度的方式進行搜尋,就是把所有可行的方案都列舉出來,不斷的去嘗試,直到找到問題的解。設想你在乙個迷宮裡面,當我們在起點時,總要通過各種岔路口才能找到迷宮的終點,那麼...