dfs遞歸寫全排列是真的讓我頭大,看了好長時間!總結一下吧,免得忘記!
寫法一:
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int vis[10];//用於標記是否被訪問過,0--未訪問 1--已訪問 int ans[10];//用於存儲答案 int n; void dfs(int step) { for(int i = 1; i <= n; i++) { if(vis[i] == 0) { vis[i] = 1; ans[step] = i;//將答案存儲 if(step < n) //調用遞歸 dfs(step + 1); //即相當於再一次從頭執行一個dfs函數,可以理解為一個嵌套 else { for(int i = 1; i <= n; i++){ printf("%d",ans[i]); if(i != n) //用於控制輸出格式 printf(" "); else printf("\n"); } } vis[i] = 0; //訪問完畢返回標記為可訪問 //只有當輸出了一個結果后才有可能執行 } } } int main() { while(~scanf("%d",&n)) { memset(vis, 0, sizeof(vis)); dfs(1); } return 0; }
寫法二:
#include<bits/stdc++.h> using namespace std; int n; int step; int vis[105]; int a[105]; void dfs(int step) { if(step == n + 1) { for(int i = 1; i <= n; i++) { printf("%d",a[i]); if(i != n) printf("*"); else { printf("\n"); } } } for(int i = 1 ; i <= n; i++) { if(vis[i] == 0) { vis[i] = 1; a[step] = i; dfs(step + 1); vis[i] = 0; } } } int main() { while(~scanf("%d",&n)) { memset(vis, 0 ,sizeof(vis)); step = 0; dfs(1); } return 0; }