全排列(无重复元素、不去重、去重)

1.不含重复元素

对于输出序列p的每一个位置,每次从输入序列a中选择一个没有出现过的元素作为当前元素固定下来,对于剩余未确定的位置,减小规模,递归的进行全排列,直到每个元素都确定下来,打印输出序列。

#include
#include
#include
#include
using namespace std;
const int maxn=100;
int a[maxn];
int p[maxn];
int N;

void perm(int k,int n)
{
	if(k==n)
	{
		for(int i=0;i

2.含重复元素(不去重)

在不含重复元素算法的基础上进行了一些改动:

1)每次从原始序列a选择元素来讨论时,不再是从头到尾遍历a,而是选择一个新的元素。

    这可以通过先对a进行排序,再每次选择一个与其前一个元素不同的元素。

2)选择出元素后还要讨论该元素是否能固定下来

    需要统计前为止该元素在序列中出现次数c1,元素在原始序列中的出现次数c2

   若c1

#include
#include
#include
#include
#include
using namespace std;
const int maxn=100;
int a[maxn];
int p[maxn];
int N;

void perm(int k,int n)
{
	if(k==n)
	{
		for(int i=0;i

3. 含重复元素(去重)

在不去重算法的基础上进行改进:

1)把原始序列进行去重操作,得到新的序列b。

2)遍历序列b的每个元素,进行全排列,此时算法思路与不含重复元素的算法相同。

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=100;
int a[maxn];
int p[maxn];
vector b;
int N;

void perm(int k,int n,int n1)
{
	if(k==n1)
	{
		for(int i=0;i

 

 

你可能感兴趣的:(机试准备)