题目:
如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
...
现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?
【输入格式】
一行,一个串。
【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。
例如:
输入:
bdca
程序应该输出:
11
再例如:
输入:
cedab
程序应该输出:
70
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。
解题思路:将输入数组a转换为整形并传入到b,c。b为原顺序,c为排序后的顺序。令i=0,j=0,sum=0。b[i],c[j]如果相等i++,j++;如果不等那么sum=sum+(n-j-1)!,i++。
注意;b[i]与c[j]不相等时还要判断在这一位上有多少个(n-j-1)!。比如abcd这四个数,让你求bdca的序号,c[0]与b[0]比较a不等于b,所以前面a开头的序号有(4-0-1)!个,
然后令c[1]与b[1]比较,那么要用以ba开头的(4-1-1)!加上以bc开头的(4-1-1)!,即2*(4-1-1)。倍数2取决于在有序序列abcd中d前面中还未使用的数的个数。以此类推。
代码如下:
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int main() { char a[11]; //输入 int b[11],c[11]; //b转化为整形后的数组,c未排序后的数组 bool visit[11]; //用于计算倍数时,标记前面以确定了的数 while(cin>>a) { memset(visit,0,sizeof(visit)); int sum=0,s,bei,d; int n=strlen(a); for(int i=0; i<n; i++) //a传到cd { b[i]=a[i]; c[i]=a[i]; } sort(c,c+n); for(int j=0; j<n; j++) { s=1; bei=0; d=0; while(visit[d]==1) //找到最前面未确定的数的位置 d++; if(c[d]==b[j]) { visit[d]=1; continue; } else { d=0; while(b[j]!=c[d]) { if(visit[d]==0) { d++; bei++; } else { d++; } } visit[d]=1; for(int i=1; i<=n-j-1; i++) { s=s*i; } sum+=s*bei; } } cout<<sum<<endl; } return 0; }