n个元素 {1,2, …,n} 有n!个不同的排列。将这 n! 个排列按字典序排列, 并编号为 0,1,…,n!-1 。每个排列的编号为其字典序值。例如,当n=3时,6个不同排列的字典序值如下:
字典序值 | 0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
排列 | 123 | 132 | 213 | 231 | 312 | 321 |
输入格式:
第一行是元素个数n(1<n<=8),接下来的1行是n个元素{1,2,...,n}的一个排列。题目不会给出最后一个排列。
输出格式:
第一行输出计算出的排列的字典序值,第二行输出按字典序排列的下一个排列。
输入样例:
3
2 3 1
结尾无空行
输出样例:
3
3 1 2
结尾无空行
代码实现:
#include <bits/stdc++.h>
using namespace std;
int a[12],goal[12];
int k;
bool check(int a[],int b[]){
for(int i = 1;i<=k;i++){
if(a[i]!=b[i])
return true;
}
return false;
}
int main ()
{
int con = 0;
cin>>k;
for(int i = 1;i<=k;i++){
a[i] = i;
cin>>goal[i];
}
while(check(a,goal)){
next_permutation(a+1,a+k+1);
con++;
}
cout<<con<<endl;
next_permutation(a+1,a+k+1);
for(int i = 1;i<=k;i++) {
cout<<a[i];
if(i!=k) cout<<" ";
}
return 0;
}