全排列问题(可重复排列和不可重复排列)

全排列

1. 不可重复全排列

全排列问题一般要求按照字典顺序排列出来.

例如:

1 2 3     1 3 2

2 1 3     2 3 1

3 1 2     3 2 1

全排列问题一般尝试用递归的方式去做,用 for 循环来解决字典序的问题.

#include 
using namespace std;
const int N=1024;
int vis[N];
int A[N];
void print_permutation(int n,int cur)
{
	if (cur==n)			//cur==n 表示已经得到一组排列,输出 
	{
		for (int i=0;i

2. 可重复全排列

之前的代码只能保证1-n的全排列,但是待排列元素不是1~n,比如是 1 1 2 的排列

排列如下:

1 1 2

1 2 1

2 1 1

新的要求下,我们要对代码进行小小的改动。

设置读入数组P[N],读入可重复元素序列,统计每个元素出现的次数;

在递归的时候,我们只需要检查某元素在A数组中出现次数和P数组中次数是否相等即可。若不相等,可以继续添加,否则不能继续添加。

除了这个之外,我们还应该考虑重复枚举的状况。

例如:1 1 1 2

在排列中多次枚举中重复出现

1 1 1 2、1 1 1 2 或者 1 2 1 1 、 1 2 1 1 等其他情况。

我们只需要保证同一层递归中,当前添加的元素和上一次添加的元素不同即可。

代码如下:

#include 
#include  
using namespace std;
const int N=1024;
int A[N];
int P[N]; 
int vis_A[N],vis_P[N]; //这里注意数组范围应与实际元素范围匹配
void print_permutation_repitition(int n,int cur)
{
	if (cur==n)
	{
		for (int i=0;i

 

你可能感兴趣的:(基础算法,算法与数据结构)