1. 程式人生 > >C++DFS方法全排列

C++DFS方法全排列

前幾天看紀磊的《啊哈!演算法》一書,裡面講演算法講的特別通俗細緻,真的是初中生都能讀得懂的演算法書(我大二才讀: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; }