搜索与回溯,指数级算法。
#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; using namespace std; vector<int>chosen; int n; void dfs(int x){ if(x==n+1){ for(unsigned i=0;i<chosen.size();++i) printf("%d ",chosen[i]); puts(""); return; } dfs(x+1); chosen.push_back(x); dfs(x+1); chosen.pop_back(); } int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); read(n); dfs(1); return 0; }
搜索与回溯。要字典序最小,所以优先往加入当前节点的分支搜索。
#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; using namespace std; vector<int> chosen; unsigned n,m; void dfs(unsigned x){ if(chosen.size()>m||chosen.size()+(n-x+1)<m) return; if(x==n+1){ for(unsigned i=0;i<chosen.size();++i) printf("%d ",chosen[i]); puts(""); return; } chosen.push_back(x); dfs(x+1); chosen.pop_back(); dfs(x+1); } int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); read(n),read(m); dfs(1); return 0; }
搜索与回溯
#include<bits/stdc++.h> #define rg register #define il inline #define co const template<class T>il T read(){ rg T data=0,w=1; rg char ch=getchar(); while(!isdigit(ch)){ if(ch=='-') w=-1; ch=getchar(); } while(isdigit(ch)) data=data*10+ch-'0',ch=getchar(); return data*w; } template<class T>il T read(rg T&x){ return x=read<T>(); } typedef long long ll; int n,order[11]; bool chosen[11]; void dfs(int x){ if(x==n+1){ for(int i=1;i<=n;++i) printf("%d ",order[i]); puts(""); return; } for(int i=1;i<=n;++i)if(!chosen[i]){ chosen[i]=1,order[x]=i; dfs(x+1); chosen[i]=0; } } int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); read(n); dfs(1); return 0; }