全排列生成方法汇总
递归法 按字典序生成
整体思路:首先原序列已经按照字典序排好,继而通过逐个添加新字符生成新序列,字符添加所遵守的规则即是,按照字典序贪心地添加,(遇到未与已确定序列重复的字符,就添加在后面;遇到重复的就跳过这个字符),第一个由于不存在会重复的情况,所以生成序列即为原table,之后逐个回溯,由于是从后往前,故字典序逐个上升,符合要求。附代码
#include<iostream>
#include<cstring>
using namespace std;
//permutation
char table[]="abcdefgh";
char res[100];
int n;
void solve(int cur){
if(cur==n){
res[cur]=0;
puts(res); //对当前结果的处理
return;
}
for(int i=0;i<n;i++){
bool ok=true;
for(int j=0;j<cur;j++) //如果之前用过该字符,则弃用
if(table[i]==res[j])
ok=false;
if(ok){
res[cur]=table[i];
solve(cur+1);
}
}
}
int main()
{
while(cin >> n)
solve(0);
return 0;
}
附上输出全组合代码,思路类似:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans[100];
int n,m;
void print();
void solve(int l,int r,int mm){
ans[m-mm+1]=l;
if(mm==1){
print();
return;
}
for(int i=1;l+i<=r;i++){
solve(l+i,r,mm-1);
}
}
void print(){
for(int i=1;i<=m;i++)
printf("%d ",ans[i]);
cout<<endl;
}
int main(){
cin>>n>>m;
memset(ans,0,sizeof(ans));
for(int i=1;i<=n-m+1;i++)
solve(i,n,m);
return 0;
}