有重复元素的排列问题

来源:互联网 发布:vs2015写c语言 编辑:程序博客网 时间:2024/06/07 10:18

有重复元素的排列问题

原题

有重复元素的排列问题(perm)
【问题描述】
设R={ r1, r2 , …, rn}是要进行排列的n个元素。其中元素r1, r2 , …, rn可能相同。试设计一个算法,列出R的所有不同排列。
【编程任务】
给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。
【输入格式】
由perm.in输入数据。文件的第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。
【输出格式】
计算出的n个元素的所有不同排列输出到文件perm.out中。文件最后1行中的数是排列总数。
【输入样例】
4
aacc
【输出样例】多解
aacc
acac
acca
caac
caca
ccaa
6

算法分析

该题有三种做法

  • 爆搜+判重(99%超时)
  • dp排列组合
  • STL(next_permutation)用法见此处
    本人用的是第三种(当然是因为代码量少)

标程

#include <iostream>#include <algorithm>#include <string>#include <cstdio>using namespace std;int main(){    freopen("perm.in","r",stdin);    freopen("perm.out","w",stdout);    string str;    cin >> str >> str;      sort(str.begin(), str.end());      int num = 1;    cout << str << endl;    while (next_permutation(str.begin(), str.end()))      // next_permutation不是最后一个排序返回true,否则返回false    {        cout << str << endl;        num++;     }    cout << num << endl;/*    Name: skyler2003     Date: 21/07/2017 19:29*/    fclose(stdin);    fclose(stdout);     return 0;}
原创粉丝点击