有重复元素的排列问题

来源:互联网 发布:sql unique 约束 编辑:程序博客网 时间:2024/06/07 08:04

有重复元素的排列问题

【问题描述】
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。
【编程任务】
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
【输入格式】
文件的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
【输出格式】
计算出的n个元素的所有不同排列输出。文件最后1行中的数是排列总数。
【输入样例】
4
aacc
【输出样例】多解
aacc
acac
acca
caac
caca
ccaa
6
【解题思路】
如果是不重复的序列,直接按照最简单的排列方式,采用递归的方式将第一个元素与最后一个元素交换,但题中会有重复的排列,所以可以增加一个判断的条件,判断是否有重复的,就是这么简单。。
【代码】

#include<bits/stdc++.h> //万能头文件using namespace std;long long ans;int n;char str [1001];/*检查是否重复,重复返回false,不重复返回true*/bool ok (char str[],int a,int b) {    for(int i=a;i<b;i++) {        if(str[i] == str[b])            return false;        else            return true;    }}/*传说中的核心代码*/void perm (char str[],int k,int m) {//函数的出口    if(k == m) {        ans++;        for(int i=0;i<=m;i++) {            cout << str[i];        }         cout <<endl;         return;    }    else {        for(int i=k;i<=m;i++) {            if(ok(str,k,i)) {                swap(str[k],str[i]);//交换                perm(str,k+1,m);//递归                swap(str[k],str[i]);//要归位            }        }    }}/*主函数 没毛病*/int main() {    cin>>n;    for(int i=0;i<n;i++) {        cin>>str[i];    }    getchar();    perm(str,0,n-1);    cout<<ans<<endl;    return 0;}