递归算法之全组合排列

输入:

给定数据数N,然后输入n个数字,找出所有的排列数。

输出:

输出所有的排列数。

样例输入:

3

1 2 3

样例输出:

123

132

213

231

312

321

思路:

也是递归求解的典例。

代码如下:

<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
int a[110],b[110],c[110];
int n;
void res(int len)
{
	if(len>=n)//递归结束条件
	{
		for(int i=0;i<n;i++)
		printf("%d",c[i]);
		puts("");
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(!b[i])//通过b[i]来判断是否出现过一次
		{
			b[i]=1;
			c[len]=a[i];//将值复制给数组C c[i]用于输出数据
			res(len+1);//进行一系列递归
			b[i]=0;//保证后面的能输出多组数据
		}
	}
}
int main()
{
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
		scanf("%d",&a[i]);//a[i]用来暂时存储元素
		memset(b,0,sizeof(b));//初始化 ,b[i]用来标记
		res(0);
	}
	return 0;
}</span>
时间: 2024-08-08 09:25:53

递归算法之全组合排列的相关文章

递归求解几类排列组合问题(二、全组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 3 1 2 3 Sample Output 123 132 213 231 312 321 #include<stdio.h> #include<strin

递归算法之类循环组合排列

输入: 给定数据,输入n,m.分别代表位数,可能取到的值. 输出: 输出所有可能的数字. 样例输入: 4 2 样例输出: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 题目分析: 这是一种典型的递归算法-------类递归组合排列. 代码如下: <span style="font-size:14px;">#include<stdio.h> int n

《程序设计中的组合数学》——全错位排列

承接上文,这次以递推的思维,介绍组合学当中一个很经典的问题. 这个问题最开始由瑞士数学家欧拉提出,原始的问题被叫做“装信封问题”,问题的大意就是:有n封信和n封它们各自对应的信封,如果邮递员想要把每封信都放在不属于这封信的信封,那么请问有多少种排法.(这邮递员真无聊)  想必这个问题在中学阶段数学的[排列组合]都有过接触,但是我记忆非常深刻的是,老师讲到这个模型,自己找了一下n = 5的情况就停止了,然后让大家把前面的数字序列背下来.今日故地重游不禁觉得老师教的好坑爹,搞学习还是要亲历亲为自主探

递归求解几类排列组合问题(一、类循环组合排列)

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. 一.类循环组合排列 Sample Input : 4 2 Sample Output 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 10

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

递归求解几类排列组合问题(四、普通选择性组合排列)

四.普通选择性组合排列 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 5 3 1 2 3 4 5 Sample Output 123 124 125 134 135 145 234 235 245 345 #i

常见算法之全排列 全组合

全排列算法是一种比较常考的算法,他的做法也比较多样. 首先我们来看看最符合我们直观思考的,思路是这样的:假如没有重复元素时,传入一个数组A,并插入到另外一个数组B中,假如B中已经包含这个元素,则跳过,否则插入数组B.我们来看看具体代码: <span style="font-size:14px;">public static void permutation1(final String str, String buffer){ if (str.length() == buff

全排列和全组合实现

记得@老赵之前在微博上吐槽说,“有的人真是毫无长进,六年前某同事不会写程序输出全排列,昨天发邮件还是问我该怎么写,这时间浪费到我都看不下去了.” 那时候就很好奇全排列到底是什么东西,到底有多难? 今天复习的时候终于碰到这题了,结果果然自己太渣,看了好久都没明白,代码实现又是磕磕碰碰的.所以,就把它整理成笔记加深记忆,也希望能帮到和我一样的人. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.b

搜索入门练习题3 全组合 题解

题目出处:<信息学奥赛一本通>例5.2. 题目描述 设有 \(n\) 个数的集合 \(\{1,2,...,n\}\) ,从中任意取出 \(r\) 个数进行排列 \((r \le n)\) ,试列出所有的排列. 输入格式 输入包含两个正数 \(n,r(1 \le r \le n \le 10)\) 输出格式 输出从 \(n\) 个数的集合中选出 \(r\) 个数的所有组合,每个组合方案占一行.对于每个组合,按照从小到大的顺序输出组合中的所有元素,两两之间有一个空格分隔. 样例输入 3 2 样例输