7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!
一:题目n个元素 {1,2, …,n} 有n!个不同的排列。将这 n! 个排列按字典序排列, 并编号为 0,1,…,n!-1 。每个排列的编号为其字典序值。例如,当n=3时,6个不同排列的字典序值如下:字典序值012345排列123132213231312321输入格式:第一行是元素个数n(1<n<=8),接下来的1行是n个元素{1,2,…,n}的一个排列。题目不会给出最后一个排列。输
·
一:题目
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;
}
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)