这个算法思想其实就是跟全排列的算法思想类似,主要区别是对重复元素的处理。见ok这个函数。
算法设计:给定n及待排列的n个元素。计算出这n个元素的所有不同排列。
以下用C语言实现算法的代码:
#include "stdafx.h"
void perm(char list[], int k, int m);
void swap(char &a, char &b);
int ok(char list[],int k,int i);
int main()
{
int a,c;
char list[] = {'a','a','c','c'};
perm(list, 0, 3);
scanf("&d ",&a);
}
void perm(char list[], int k, int m)
{
if (k==m)
{
for (int i = 0; i <=m; i++)
{
printf("%c",list[i]);
}
printf("\n");
}
else
{
for (int i = k; i <= m; i++)
{
if(ok(list,k,i)){
swap(list[k], list[i]);
perm(list, k + 1, m);
swap(list[k], list[i]);
}
}
}
}
void swap(char &a, char &b)
{
int temp = a;
a = b;
b = temp;
}
int ok(char list[],int k,int i){
if(i>k)
for(int t=k;t<i;t++)
if(list[t]==list[i])
return 0;
return 1;
}
初学者可以根据程序代码理解算法思想。