算法1:dfs
当还在外星人给出的排列这个阶段的时候,我们就直指外星人给出的序列中的数,这点是很重要的。
然后每深度搜索一次,就cnt ++,知道搜索次数足够,则输出。
其他就是全排列的过程
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n,m,cnt;
bool st[N],ok = false;
int a[N];
void dfs(int u)
{
if(ok) return;
if(u > n){
cnt ++;
if(cnt == m + 1){//当我们要加上全拍列的时候就直接输出
for(int j = 1;j <= n;j ++) cout << a[j] << " ";
puts("");
ok = true;
}
return;
}
for(int i = 1;i <= n;i ++){
if(!cnt) i = a[u];//当还在外星人给出的排列这个阶段的时候,我们就直指外星人给出的序列中的数
if(!st[i]){
st[i] = true;
a[u] = i;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++ ) cin >> a[i] ;
dfs(1);
return 0;
}
算法2:STL
这个算法我就不多说了直接用STL即可。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 1;i <= m;i ++)
next_permutation(a + 1,a + n + 1);
for(int i = 1;i <= n;i ++) cout << a[i] << " ";
puts("");
return 0;
}