一.dfs形式
1.
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[20];
int a[20];
int n;
void dfs(int depth){
for(int i=1;i<=n;i++){
if(!vis[i]){
a[depth]=i;
vis[i]=1;
if(depth==n)
for(int j=1;j<=n;j++)
if(j!=n) printf("%d ",a[j]);
else printf("%d\n",a[j]);
else dfs(depth+1);
vis[j]=0;///返回原值为新排列做准备
}
}
}
int main(){
memset(vis,0,sizeof(vis));
scanf("%d",&n);
dfs(1);
return 0;
}
2.
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int vis[20];
int a[20];
int n;
void dfs(int depth){
if(depth==n+1){
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
if(i==n) printf("\n");
}
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
a[depth]=i;
vis[i]=1;
dfs(depth+1);
vis[i]=0;///返回原值为新排列做准备
}
}
}
int main(){
memset(vis,0,sizeof(vis));
scanf("%d",&n);
dfs(1);
return 0;
}
二.next_permutation形式
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[]={1,2,3};
sort(a,a+3);
do{
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
}while(next_permutation(a,a+3));
cout<<"origal:"<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
return 0;
}
三、应用
大写字母ABB,通过排列得到ABA,ABB,BBA,求任一组大写字母得到这样的形式。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
int vis[20];
char a[20];
char b[20];
set<string>s;
int n;
void dfs(int depth) {
if (depth == n ) {
string str="";
for (int i = 0; i < n; i++) {
str += a[i];
}
s.insert(str);
return;
}
for (int i = 0; i < n; i++) {
if (!vis[i]) {
a[depth] = b[i];
vis[i] = 1;
dfs(depth + 1);
vis[i] = 0;///返回原值为新排列做准备
}
}
}
int main() {
memset(vis, 0, sizeof(vis));
cin>>b;
n=strlen(b);
dfs(0);
set<string>::iterator it;
for (it = s.begin(); it != s.end(); it++) {
cout <<*it << endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
int vis[20];
char a[20];
set<string>s;
int main() {
cin>>a;
sort(a,a+strlen(a));
do{
string str="";
for(int i=0;i<strlen(a);i++){
str+=a[i];
}
s.insert(str);
}while(next_permutation(a,a+strlen(a)));
set<string>::iterator it;
for (it = s.begin(); it != s.end(); it++) {
cout <<*it << endl;
}
return 0;
}