全排列
#include<bits/stdc++.h> using namespace std; int pl[1001]; void print (int n){ for(int i=1;i<=n;i++) cout<<" "<<pl[i]; cout<<endl; } void pp(int n,int pos=1){ if(pos==n+1) { print(n); return ; } for(int i=1;i<=n;i++){ bool ok=1; for(int j=1;j<pos;j++){ if(pl[j]==i) ok=0; } if(ok) { pl[pos]=i; pp(n,pos+1); } } } int main(){ int n; cin>>n; pp(n); return 0; }
有重复元素的全排列//然而并不能过所有测试点
#include<bits/stdc++.h> using namespace std; char pl[1001]; int cnt; void print(int n){ for(int i=0;i<n;i++) cout<<pl[i]; cnt++; cout<<endl; } void pp(char p[],int n,int pos=0){ if(pos==n){ print (n); return ; } for(int i=0;i<n;i++){ if(i==0||p[i]!=p[i-1]){ int c1=0,c2=0; c1=count (pl,pl+pos,p[i]); c2=count (p,p+n,p[i]); if(c1<c2){ pl[pos]=p[i]; pp(p,n,pos+1); } } } } int main(){ int n; char ddd[2000]; cin>>n; for(int i=0;i<n;i++){ cin>>ddd[i]; } pp(ddd,n); cout<<cnt; return 0; }
所以我用STL模板
STL大法好
这里是char类型的
#include<bits/stdc++.h> using namespace std; int main(){ long long cnt=0; ios::sync_with_stdio(false); char dd[5000]; int n; cin>>n; for(int i=0;i<n;i++) cin>>dd[i]; sort (dd,dd+n); do{ for(int i=0;i<n;i++){ printf("%c",dd[i]); } cnt++; printf(" "); }while(next_permutation(dd,dd+n)); printf("%d",cnt); return 0; }