目录
全排列V1
输入一个整数n(n <= 9),输出1、2、3、······、n这n个数的全排列(按照字典序输出)。
输入格式
一个整数n
输出格式
多行,每行表示一种排列,行内使用空格分隔相邻两数。
输入样例
3
输出样例
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <bits/stdc++.h>
using namespace std;
int n,k;
bool flag[26];
int s[30];
void d(int x){
if(x==n){
for(int j=0;j<n;j++){
cout<<s[j]<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(flag[i]){
continue;
}
s[x]=i;
flag[i]=1;
d(x+1);
flag[i]=0;
}
}
int main(){
scanf("%d",&n);
d(0);
}
全排列V2
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = "131",
输出为:
113
131
311
输入格式
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
输出格式
输出S所包含的字符组成的所有排列
输入样例
1312
输出样例
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
#include <bits/stdc++.h>
using namespace std;
int n,k;
bool flag[26];
char s[30];
int a[30];
int len;
void d(int x){
if(x==len){
for(int j=0;j<len;j++){
cout<<a[j];
}
cout<<endl;
return;
}
for(int i=0;i<len;i++){
if(flag[i]|| (!flag[i-1]&&s[i]==s[i-1])){
continue;
}
a[x]=s[i]-'0';
flag[i]=1;
d(x+1);
flag[i]=0;
}
}
int main(){
scanf("%s",&s);
len=strlen(s);
sort(s,s+len);
d(0);
}
重新排列 n个数使得每一个数字都不在原来的位置上
公式:f(n)=(n-1)*(f(n-1)+f(n-2))
总结
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[20];
cin >> s;
int l = strlen(s);
sort(s, s + l);
do
{
cout << s << endl;
} while (next_permutation(s, s + l));
}
while (next_permutation(s, s + l))可以直接全排列;