深度優先搜索 全排列

參考:啊哈算法 p74頁

 

遞歸的執行過程 

 

#include"stdio.h"

int n;//1-n的全排列 
int a[20];//默認初始化爲零 
int book[20];//默認初始化爲零 
void dfs(int step) //step 第幾個數字 
{
    if(step==n+1)//判斷是否可以結束遞歸/遞歸結束條件  
    {   int j;
        for(j=1;j<=n;j++)
        {
              printf("%d",a[j]);
        } 
        printf("\n");
        return ;
    }
    int i;
    for(i=1;i<=n;i++)
    {
        if(book[i]==0)//數字如果沒有嘗試過,當前進行嘗試  
        {
         a[step]=i;
         book[i]=1;//book[i]用來標識i這個數字是否之前用過,book[i]等於1表示i已經被用過。 
         dfs(step+1);
         book[i]=0;//結束此次標記,這樣下次的一條路徑才能用這個數字。否則一條路徑用了n個數字,用完了數字,沒法玩了。  
        } 
}    

int main()
{
    scanf("%d",&n); 
    dfs(1);    
    return 0; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章