【ACM】DFS & 全排列 & 回溯
阿新 • • 發佈:2018-11-19
深入體會一下DFS,回溯
在一些OJ上endl和“\n”還是有區別的!!!
方法一:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000; int vis[maxn],a[maxn],n; int dfs(int step) { int i; if(step==n+1) { for(i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); } else { for(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)==1 && n) { dfs(1); } return 0; }
方法二:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1000; int vis[maxn],a[maxn],n; void dfs(int x,int index) { int i; a[index]=x; if(index==n-1) { for(i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); return ; } else { for(i=1;i<=n;i++) { if(vis[i]==0) { vis[i]=1; dfs(i,index+1); vis[i]=0; } } } } int main () { int i; while(scanf("%d",&n)==1 && n) { memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { vis[i]=1; dfs(i,0); vis[i]=0; } } return 0; }