全排列
- 输入一个整数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>
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int arr[10];
int main(){
int n,i;
cin>>n;
for(i=1;i<=n;i++){
arr[i]=i;
}
do{
for(int i=1;i<=n;i++)
printf("%d ",arr[i]);
printf("\n");
}while(next_permutation(arr+1,arr+n+1));
return 0;
}
- 给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。
输入
输入一个字符串S(S的长度 <= 9,且只包括0 - 9的阿拉伯数字)
输出
输出S所包含的字符组成的所有排列
输入样例
1312
输出样例
1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int arr[20];
char str[15];
int main(){
gets(str);
n=strlen(str);
for(int i=0;i<n;i++){
arr[i]=str[i]-'0';
}
sort(arr,arr+n);
do{
for(int i=0;i<n;i++)
printf("%d",arr[i]);
printf("\n");
}while(next_permutation(arr,arr+n));
return 0;
}
全排列函数还是牛逼的,针对数字排列的问题基本上都是秒解~但是要注意啊,这里最好不要用cout!会出现时间超限的问题!
除了直接用全排列函数,还有没有其他的方式来解决全排列类的问题?
…还可以使用递归,额。。。也可以称作深搜+回溯!
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[15];
bool vis[15];
void dfs(int x){
if(x==n+1){
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(int i=1;i<=n;i++){
if(!vis[i]){
a[x]=i;
vis[i]=1;
dfs(x+1);
vis[i]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
//include<bits/stdc++.h>
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,b[20];
char a[15];
bool vis[15];
void dfs(int num[],int step){
if(step==n){
for(int i=0;i<n;i++){
printf("%d",b[i]);
}
printf("\n");
return;
}
for(int i=0;i<n;i++){
if(!vis[i]){
vis[i]=1;
b[step]=num[i];
dfs(num,step+1);
vis[i]=0;
while(i<n-1&&num[i]==num[i+1]){//重复的数字就不需要再进行全排列了。
i++;
}
}
}
}
int main(){
int num[20];
gets(a);
n=strlen(a);
for(int i=0;i<n;i++){
num[i]=a[i]-'0';
}
sort(num,num+n);
dfs(num,0);
return 0;
}