7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!

一:题目

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; 
		}		
	}	
}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值