[蓝桥杯][2014年第五届真题]排列序数

题目描述

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

c++语言AC代码

#include <iostream>
#include<algorithm>
#include <stdio.h>
#include<string.h>
using namespace std;
int b[11],cou1=-1,ans=0;
char a[11],c[11],d[11]; 
void dfs(int cou)	//cou表示安排第几个字符 
	{
		if(cou==strlen(a))	//若果字符数达到,是一种全排列(0开始),和目标进行比较,相同记录结果跳出 
			{	cou1++;
			//	printf("%s  %d\n",c,cou1);
				if(strcmp(d,c)==0)	//比较 
					{
						ans=cou1;//保存结果,返回 
						return ;
					}
			}
		else {
			int i;
			for(i=0;i<strlen(a);i++)	
				{
					if(b[i]==0)	//未被选择过 
						{
							c[cou]=a[i];	//添加到某种全排列 
							b[i]=1;//标记 
							dfs(cou+1); //找下一个字符,回溯 
							b[i]=0;
						}
				}
		}
	}
int main()
{
	scanf("%s",&a);//输入目标态 
	int i,j;
	strcpy(d,a);//保存 
	sort(a,a+strlen(a));//对出现的字母进行排序,然后按照深搜全排列 
	dfs(0);//深搜,全排列 
	printf("%d",ans);
	return 0;
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页