STL中有两个关于全排列的函数
- 求下一个全排列next_permutation(arr,arr+size);
- 求上一个全排列prev_permutation(arr,arr+size);
- 如果没有下一个返回false
注意:
- 两个函数都是从当前状态出发,寻找下一个全排列
- 返回为bool值
练习
#include<iostream>
#include<algorithm>
#define N 1005
using namespace std;
int inf=0x3f3f3f3f;
int a[N];
int main(){
int n,m;
while(cin>>n>>m){
for(int i=1;i<=n;i++){
a[i]=i;
}
int sum=1;
while(sum!=m){
next_permutation(a+1,a+n+1);
sum++;
}
cout<<a[1];
for(int i=2;i<=n;i++)
cout<<" "<<a[i];
cout<<endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<string.h>
#define N 200005
using namespace std;
int inf=0x3f3f3f3f;
int n,m,sum;
int a[N];
int vis[N]={0};
void dfs(int now){
if(sum==m)
return ;
if(now>n){
if(++sum==m){
cout<<a[1];
for(int i=2;i<=n;i++)
cout<<" "<<a[i];
cout<<endl;
return ;
}
return ;
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
a[now]=i;
dfs(now+1);
if(sum==m)
return ;
vis[i]=0;
}
}
return;
}
int main(){
while(cin>>n>>m){
memset(vis,0,sizeof(vis));
sum=0;
dfs(1);
}
return 0;
}