STL_算法(17)_排列组合 next_permutation() perv_permutation()

next_permutation()

prev_permutation()

#include<iostream>
#include<algorithm>
#include<vector>
// 排列组合开始之前一定要先排序

using namespace std;

int main()
{
	vector<int> ivec;

	ivec.push_back(1);
	ivec.push_back(2);
	ivec.push_back(3);

	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
		cout << *iter << ' ';
	cout << endl;
	//下一个排列组合 该算法返回值为bool  若返回值为true 说明还有下一个排列组合,但是若为fals 说明排列组合已经排列完了
	next_permutation(ivec.begin(), ivec.end());
	for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
		cout << *iter << ' ';
	cout << endl;

	while (next_permutation(ivec.begin(), ivec.end()))
	{
		for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++)
			cout << *iter << ' ';
		cout << endl;
	}

	cout << endl << endl;
	cout << endl << endl;
	cout << endl << endl;

	vector<int> ivec2;
	ivec2.push_back(3);
	ivec2.push_back(2);
	ivec2.push_back(1);
	for (vector<int>::iterator iter = ivec2.begin(); iter != ivec2.end(); iter++)
		cout << *iter; ' ';
	cout << endl;
	//ivec2 本身是个倒序
	while (prev_permutation(ivec2.begin(), ivec2.end()))
	{
		for (vector<int>::iterator iter = ivec2.begin(); iter != ivec2.end(); iter++)
			cout << *iter; ' ';
		cout << endl;
	}

	//
	system("pause");
	return 0;
}

时间: 2024-10-11 02:46:48

STL_算法(17)_排列组合 next_permutation() perv_permutation()的相关文章

STL_算法(21)_ STL_算法_填充新值

STL_算法_填充新值 fill(b, e, v) fill(b, n, v) generate(b, n, p) generate_n(b, n, p) #include<iostream> #include<algorithm> #include<vector> #include<list> // #include<string> using namespace std; int main() { list<string> sli

算法基础:排列组合问题(Golang实现)

[排列组合问题] 一共N辆火车(0<N<10),每辆火车以数字1-9编号,要求以字典序排序输出火车出站的序列号. 输入: 包括N个正整数(0<N<10),范围为1到9,数字之间用空格分割,字符串首位不包含空格. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行. 样例输入: 1 2 3 样例输出: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 代码实现: package huawei import ( "fmt&qu

算法练习:排列组合之子集合

问题描述 输入一个含有不同数字的序列,输出其所有子集合(含空集).要求:1)集合里元素有序排列:2)输出结果不含有重复集合 举例 输入序列{3,1,2} 输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析 可以使用排列组合问题求解的第一种方法:分期摊还.初始化时,结果集合里含有一个空集.当扫描数列时,保留原有集合,同时将当前元素插入现有的所在集合中,从而形成新的集合.详见后面代码的GetSubSetsAmortized函数. 也可以使用第二种方法:f

算法:C++排列组合

题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <iostream> using namespace std; /************************************************************************/ /* num : 需要排列的数组 count : 数组总数 numC: 已经排列的数组 iUse:

算法思维方式—— 由排列组合想到的

最近算法题也刷了不少,小有感悟. 我觉得刷题时一般的思维方式是迭代思维.就是我们老是想着通过循环,通过顺序解决下一个来迭代解决整个问题. 典型事例有:2Sum, 3Sum, 排序问题,以及用双指针或快慢指针法解决的问题. 迭代思维是一种很直接的思维方式,但绝不简单,因为找到正确的循环方式并不是一件容易的事情. 但有些问题用迭代思维方式是很难解决的,或者说这些问题本身就不适合用循环来解. 比如求组合数问题.C(n, 2)还能用2层循环来解,但C(n, m)呢?用迭代就很难求解了,不自然.这是用递归

算法练习:排列组合之全排列

问题描述 输入一个不含相同数字的序列,输出所有可能的排列. 问题分析 与之前的"求解子集合"类似,使用递归方法:典型的在for循环内调用递归函数.不同的是,必须等到所有的数字均在集合里才能输出.为了记录每个数字的使用情况,还需一个辅助数组记录每个数字的使用情况.详见代码部分的FullPermutation函数. 扩展问题 如果数列中含有重复的数字,并且输出的结果不含重复组合,那么怎么处理?比如,输入{1,1,2},输出{1,1,2}, {1,2,2}, {2, 1, 1}.我们在挑选数

算法练习:排列组合之组合和

问题描述 给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值.要求: 1)每个组合里的元素按照升序排列. 2)输出组合里不含有重复的组合. 3)输入序列中的整数可以多次使用. 举例: 输入{2,3,4,7},目标值为7 输出{7},{2,2,3},{3,4} 问题分析 为了让输出元素按升序排列,可对输入序列进行排序.同这里我们使用递归的方法来解决这个组合问题,即典型的for语句内调用递归函数.需要注意以下几点: 1)记录剩余目标值和,只有当该值为0时,组合才是

nyoj19(排列组合next_permutation(s.begin(),s.end()))

题目意思: 从n个数中选择m个数,按字典序输出其排列. http://acm.nyist.net/JudgeOnline/problem.php?pid=19 例: 输入:n=3,m=1; 输出:1 2 3 输入:n=4,m=2; 输出:12 13 14 21 23 24 31 32 34 41 42 43 题目分析: 此题为全排列的前m个数,只需对n个数调用全排列函数next_permutation(),去除重复的输出前m个即可. AC代码: /** *改写的全排列,这里用字符串输入,方便判断

STL_算法(22)_ STL_算法_替换算法

replace(b, e, ov, nv) replace_if(b, e, p, v) // 一边复制一遍替换 replace_copy(b1, e1, b2, ov, nv) replace_copy_if(b1, e1, b2, p, v) // 带有一个函数对象或者规则 #include<iostream> #include<algorithm> #include<list> // #include<functional> using namespa