用DFS輸出n個數的全排列(遞迴實現)
阿新 • • 發佈:2018-12-24
最近在研究DFS,可能腦子不太夠吧,很多題都不知道怎麼實現,全排列應該是最簡單的題了。
執行成功的程式碼如下所示:
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int n; int vis[11] = {0} ;//訪問陣列 int numth[11] ; void dfs(int x) { int i; if(x>n) //x大於n時輸出,不能等於,等於時numth[n]還沒被賦值 { for(i=1;i<=n;i++) cout<<numth[i]<<" "; cout<<endl; } for(i=1;i<=n;i++) { if(!vis[i]) //判斷是否被訪問 { vis[i] = 1; numth[x] = i; dfs(x+1); vis[i] = 0; //回溯 } } } int main() { while(cin>>n) { memset(vis,0,sizeof(vis));//訪問陣列置0 dfs(1); //陣列numth[]從1開始遍歷,注意不是0 } return 0; }
但是當我換了一種方式描述時,卻出現了bug,我不知道問題出在哪裡,可能以後我就突然解決了,還請各位大神多多幫助
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int n; int vis[11] = {0} ;//訪問陣列 int numth[11] ; void dfs(int x) { int i; if(x>n) //x大於n時輸出,不能等於,等於時numth[n]還沒被賦值 { for(i=1;i<=n;i++) cout<<numth[i]<<" "; cout<<endl; } for(i=1;i<=n && (!vis[i]) ;i++) { vis[i] = 1; numth[x] = i; dfs(x+1); vis[i] = 0; //回溯 } } int main() { while(cin>>n) { memset(vis,0,sizeof(vis));//訪問陣列置0 dfs(1); //陣列numth[]從1開始遍歷,注意不是0 } return 0; }
比如我輸入3,表示要求3的全排列時,結果顯示為
3 2 1
然而上面正確的程式碼顯示的是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1