C++DFS方法全排列
阿新 • • 發佈:2018-12-24
前幾天看紀磊的《啊哈!演算法》一書,裡面講演算法講的特別通俗細緻,真的是初中生都能讀得懂的演算法書(我大二才讀:P)。這段程式碼很適合初學演算法的同學。
#include<iostream> using namespace std; int a[10], book[10], n; //全排列演算法,運用深度優先搜尋dfs void dfs(int step) { int i; if (step == n + 1) //如果站在第n+1個箱子前,則表示前n個箱子已經排列好 { for (i = 1; i <= n; i++) //輸出一種排列(1-n號箱子中的撲克牌編號) { cout << a[i]; } cout<< endl; return; //返回之前的一步(最近一次呼叫dfs函式的地方) } //當站在第step個箱子面前應該放什麼牌 //依次實驗1、2、3、4.....是否可行 for (i = 1; i <= n; i++) { //判斷撲克牌i是否還在手上 if (book[i] == 0) { a[step] = i; //將第i號撲克牌放到第step個箱子中 book[i] = 1; //將book[i]設定為1則表示第i張撲克牌不在手中dfs(step + 1); //第step個箱子放好後,走到下一個箱子 book[i] = 0; //同時收回剛才嘗試的撲克牌 } } return; } int main(){ cin >> n; dfs(1); return 0; }