解题思路
花里胡哨的,10! = 3628800,这么少的数, 先从小到大排序,然后一个next_permutation函数就完事了.
但是n要是20呢? 全排列必然不行,那么就需要用到 康拓展开了。
介绍一下康拓展开:https://blog.csdn.net/Hi_KER/article/details/81263889
Code
全排列:
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout << ans << endl;
string t;
char a[12];
cin >> t;
int len = t.size();
for(int i=0;i<len;i++)
a[i] = 'a'+i;
a[len] = '\0';
int k=0;
string p;
do {
p = a;
k++;
if(p == t) {
cout << k-1 << endl;
break;
}
}while(next_permutation(a,a+len));
}
康拓展开:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int pre[12]={1};
for(int i=1;i<=10;i++)
pre[i] = pre[i-1]*i;
char a[12];
cin >> a+1;
int len = strlen(a)-1;
int ans = 0;
for(int i=1;i<=len;i++) {
int k = 0;
for(int j=i+1;j<=len;j++)
if(a[j] < a[i]) k++;
ans += k*pre[len-i];
}
cout << ans << endl; //其实ans的值是比a的字典序小的串的个数,但是因为下标是从0开始的,因此就正好是a的字典序
}