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; }