Permutation with Repetition

Description

R={ r1,r2,… ,rn }是要进行排列的n 个元素。其中元素r1,r2,… ,rn可能相同。试设计一个算法,列出R的所有不同排列。
编程任务:给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。

Input

输入由多组测试数据组成。每组测试数据的第1 行是元素个数n,1 <= n <= 500。接下来的1 行是待排列的n 个元素。

Output

对应每组输入,将计算出的n 个元素的所有不同排列输出,每种排列单独一行。最后1 行中的数是排列总数。

Sample Input

4
aacc

 

Sample Output

aacc
acac
acca
caac
caca
ccaa
6 
#include <iostream>
#include 
<cstdio>
#define N 10000
using namespace std;

int cnt;

int isOk(char *str,int a, int b)
{//此函数用于去重复排列,精华所在
    if(b > a)
        for(int i = a; i < b; i++)
            if(str[i] == str[b])
                return 0;
    return 1;
}


void Swap(char &a,char &b)
{
    
char c;
    c
= a; a = b; b = c;
}


void Perm(char *str, int k, int m)
{
    
if(k == m)
    
{
        printf(
"%s\n",str);
        cnt
++;
    }

    
else
    
{
        
for(int i = k; i <= m; i++)
        
if(isOk(str,k,i))
        
{
            Swap(str[i],str[k]);
            Perm(str,k
+1,m);
            Swap(str[i],str[k]);
        }

    }

}


int main()
{
    
char str[100];
    
int n, i;
    
while(scanf("%d",&n) != EOF)
    
{
        scanf(
"%s",str);
        cnt 
= 0;
        Perm(str,
0,n - 1);
        cout
<<cnt<<endl;
    }

    
return 0;
}

posted on 2009-03-09 21:06  Xredman  阅读(343)  评论(1编辑  收藏  举报

导航