蓝桥杯——排列序数(全排序next_permutation()函数解决)

排列序数

如果用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

以前的时候发过解这道题的一种方法:蓝桥杯——排列序数,时隔多日,当我再次回想此题时,又发现了另外一种解法,而且这种解法比上一种思路快,首先呢,题中所求的就是一个全排序的序号,由此可见我们可以借助强大的STL中的next_permutation()函数来解决,详细代码如下所示。和之前一样,我们定义一个字符数组存放a~j,还有一个计数器count,接下来输出一个字符串,先求出字符串的长度,也就是全排序中的条件,如果长度为3,则将a~c进行排序。在排序的过程中,定义一个字符数组用于存放当前的排序,如果当前的排序和输入的字符串一致的话则结束排序,要记住每一次排序都要用计数器加一,最后输出这个计数器即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
	char eng[11]="abcdefghij";
	char str[11],temp[11];
	int len,count=0,i;
	cin >>str;
	len=strlen(str);
	do{
		for(i=0;i<len;i++)
			temp[i]=eng[i];
		temp[i]='\0';
		if(strcmp(temp,str)==0)
			break;
		count++;
	}while(next_permutation(eng,eng+len));
	cout <<count;
	return 0;	
} 

猜你喜欢

转载自blog.csdn.net/qq_44888152/article/details/106759826