8594 有重复元素的排列问题(优先做)

时间限制:1000MS  内存限制:1000K
提交次数:1610 通过次数:656

题型: 编程题   语言: G++;GCC;VC

Description

设集合R={r1,r2,...,rn}是要进行排列的n个元素,其中r1,r2,...,rn可能相同。
试着设计一个算法,列出R的所有不同排列。
即,给定n以及待排的n个可能重复的元素。计算输出n个元素的所有不同排列。

输入格式

第1行是元素个数n,1<=n<=15。接下来的1行是待排列的n个元素,元素中间不要加空格。

输出格式

程序运行结束时,将计算输出n个元素的所有不同排列。最后1行中的数是排列总数。

(说明:
此题,所有计算出的排列原本是无所谓顺序的。但为了容易评判,输出结果必须唯一!
现做约定:所有排列的输出顺序如课本例2-4的程序段的输出顺序,区别仅是这道题是含
重复元素。)

输入样例

4
aacc

输出样例

aacc
acac
acca
caac
caca
ccaa
6

构造函数F(be, en)表示要对这个区间进行全排列
那么F(be, en)的结果相当于第一位是谁谁谁的 + F(be + 1, en)的结果
如果可以重复,那么第一位没有限定
但是这题有重复,那么和第一位换过的元素就不能再次换
就相当于第一位只能出现a、b、c、d、e.....只能一次

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
char str[];
int ans;
bool is[][];
void fun(int be, int en) {
if (be == en) {
ans++;
printf("%s\n", str + );
return;
}
is[be][str[be]] = true;
fun(be + , en);
for (int i = be + ; i <= en; ++i) {
if (is[be][str[i]]) continue;
is[be][str[i]] = true;
swap(str[be], str[i]);
fun(be + , en);
swap(str[be], str[i]);
}
memset(is[be], false, sizeof is[be]);
}
void work() {
int lenstr;
scanf("%d", &lenstr);
scanf("%s", str + );
fun(, lenstr);
printf("%d\n", ans);
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

最新文章

  1. vbs连接sql server及写文件操作
  2. javascript中的对象,原型,原型链和面向对象
  3. salesforce 零基础学习(十六)Validation Rules &amp; Date/time
  4. 推荐一个Android开发懒人库 -- ButterKnife
  5. URAL - 1917 Titan Ruins: Deadly Accuracy(水题)
  6. js中获取项目路径的小插件
  7. PHP组合模式
  8. 《c程序设计语言》读书笔记-字符型0-9转为数字0-9
  9. starling 中的 EventDispatcher 和 Flash中原生的 EventDispatcher
  10. 查询grep结果的前后n行
  11. 【POJ3580】【块状链表】SuperMemo
  12. 走进C标准库(4)——&quot;stdio.h&quot;中的putc
  13. Vim配置C++
  14. Windows Server 2016-重置目录还原模式密码
  15. Win10激活工具
  16. 201671010142 2017-2 《java第九章学习感悟》
  17. select下拉框左右变换
  18. 精读JavaScript模式(八),JS类式继承
  19. H5 34-背景图片
  20. jsfl 将库中声音放置到时间轴上

热门文章

  1. python中的作用域与名称空间
  2. Servlet HTTP 状态码 以及 获得浏览器URL
  3. 使用paramiko连接EC2主机
  4. C++工程实践 一个开始
  5. vimrc配置-新建文件时自动生成文件头
  6. 「美团 CodeM 初赛 Round A」最长树链
  7. Http工作原理(转)
  8. winform按钮文字换行
  9. Quadratic Residues POJ - 1808 二次剩余定理
  10. opencv-图片合成视频