一:题目

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

二:思路

这道题考察的还是全排列问题,那么在处理输出全排列的基础上,将所有输出的数据进行,放在一个vector容器当中,进行排序,然后将输入的数据(这里的将输入的数据转换成string类型来来实现字符串的拼接) 和vector中的数据进行比较

三:知识速递(如果对全排列不太熟悉的可以看一下这个图解)

全排列

四:上码

#include<bits/stdc++.h>
using namespace std;

int N;
vector<string>v;

void swap(int A[],int i,int j){
	int temp = A[i];
	A[i] = A[j];
	A[j] = temp;
} 

string printarr(int arr[]){
	//实现字符串的拼接 将int类型的数据 改为string进行字符串的拼接 
	stringstream st;
	for(int i = 0; i < N; i++){
		st << arr[i];
	}
	string str = st.str();
	return str;
}

void perm(int A[],int p,int q){
	if(p == q){
		string str = printarr(A);
		v.push_back(str); 
	}else{
		for(int i = p; i <= q; i++){
			swap(A,p,i);
			perm(A,p+1,q);
			swap(A,p,i);
		}
	}	
}


int main(){
	
	cin >> N;
	
	string str= "";
	for(int i = 0; i < N; i++){
		string nums;
		cin >> nums;
		str+=nums;
	}
	
	int arr[10];
	for(int i = 0; i < N; i++){
		arr[i] = i + 1;
	} 
	
	perm(arr,0,N-1);
	sort(v.begin(),v.end());
	
	for(int i = 0; i < v.size(); i++){
		if(v[i] == str) {
			cout << i << endl;
			
			string str = v[i+1];
			
			for(int i = 0; i < str.size(); i++){
				if(i == 0)
					cout << str[i];
				else	
				cout << ' ' << str[i];
			}
			break; 
		}		
	}	
}

在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐