生成1~n的排列,以及生成可重集的排列
#include <iostream> using namespace std; void printPermutation(int n, int* A, int cur) { if (cur == n) { // 递归边界 for (int i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n"); } else { for (int i = 1; i <= n; i++) { // 尝试在A[cur]中填各种整数i int ok = 1; for (int j = 0; j < cur; j++) { if (A[j] == i) { ok = 0; // 如果i已经在A[0]~A[cur-1]出现过,则不能再选 } } if (ok) { A[cur] = i; printPermutation(n, A, cur + 1); // 递归调用 } } } } int main() { int A[20]; printPermutation(5, A, 0); // 生成1~5的排列 return 0; }
循环变量 i 是当前考察的A[cur]。为了检查元素i是否已经用过,上面的程序用到了一个标志变量ok,初始值为1(真),如果发现有某个A[j] == i 时,则改为0(假)。如果最终ok仍未1,则说明i没有在序列中出现过,把它添加到序列末尾(A[cur] = i)后递归调用。
声明一个足够大的数组A,然后调用printPermutation(n, A, 0),即可按字典序输出1~n的所有排列。
如果问题变成输入数组p,并按字典序输出数组A个元素的所有全排列,则需要修改代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int P[100], A[100]; // 输出数组p中元素的全排列。数组p中可能有重复元素 void printPermutation(int n, int* P, int* A, int cur) { if (cur == n) { for (int i = 0; i < n; i++) printf("%d ", A[i]); printf("\n"); } else for (int i = 0; i < n; i++) { if (!i || P[i] != P[i - 1]) { int c1 = 0, c2 = 0; for (int j = 0; j < cur; j++) { if (A[j] == P[i]) { c1++; } } for (int j = 0; j < n; j++) { if (P[i] == P[j]) { c2++; } } if (c1 < c2) { A[cur] = P[i]; printPermutation(n, P, A, cur + 1); } } } } int main() { int i, n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &P[i]); } sort(P, P + n); printPermutation(n, P, A, 0); return 0; }
最后用STL中的库函数next_permultation
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { int n, p[10]; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &p[i]); } sort(p, p + n); // 排序,得到p的最小排列 do { for (int i = 0; i < n; i++) { printf("%d ", p[i]); // 输出排列p } printf("\n"); } while (next_permutation(p, p + n)); // 求下一个排列 return 0; }
上述代码同样适用于可重集。
生成1~n的排列,以及生成可重集的排列的更多相关文章
- 生成1~n的排列(模板),生成可重集的排列(对应紫书P184, P185)
生成1~n的排列: #include<iostream> using namespace std; void print_permutation(int n, int *A, int cu ...
- STL next_permutation(a,a+n) 生成一个序列的全排列。满足可重集。
/** 题目: 链接: 题意: 思路: */ #include <iostream> #include <cstdio> #include <vector> #in ...
- 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合
给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...
- [DFS]排列的生成
排列的生成 Time Limit:1000MS Memory Limit:65536K Total Submit:150 Accepted:95 Description 输出P(n,m)的排列(n,m ...
- C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
1.直接调用 已知webservice路径,则可以直接 添加服务引用--高级--添加web引用 直接输入webservice URL.这个比较常见也很简单 即有完整的webservice文件目录如下图 ...
- 把验证码和生成时间负值给$_SESSION[vCode]生成图像给浏览器
php 图片 中文验证码 <img src="verify_image.php" alt="点此刷新验证码" name="verify_code ...
- wsdl自动生成Java代码,根据wsdl生成Java代码
wsdl自动生成Java代码,根据wsdl生成Java代码 >>>>>>>>>>>>>>>>>&g ...
- VS2010-使用“预先生成事件命令行”和“后期生成事件命令行”功能
原文:VS2010-使用"预先生成事件命令行"和"后期生成事件命令行"功能 xcopy /r /y $(TargetPath) $(ProjectDir)..\ ...
- 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据
1. tf.layers.conv2d(input, filter, kernel_size, stride, padding) # 进行卷积操作 参数说明:input输入数据, filter特征图的 ...
随机推荐
- Nginx配置二级目录/路径 映射不同的反向代理和规避IP+端口访问
当配置Nginx来映射不同的服务器 可以通过二级路径来反向代理 来解决一个外网端口实现多个服务访问. 配置如下: server { listen ; server_name demo.domai ...
- MySQL查看数据库信息
使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql> show databases; ...
- Java面试16|设计模式
1.单例模式: 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式有以下几个要素: 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 单例模式根 ...
- FJUT寒假作业涨姿势题解
题意非常简单易懂,对于涨姿势0,数据非常小,比较容易想到的是直接循环暴力解题完成任务.把数据放入数组arr,循环i,j控制所有区间算和.结果记入vis. 到了涨姿势1,2,3,我们观察数据变化,发现数 ...
- springMVC源码解析--ViewResolver视图解析器执行(三)
之前两篇博客springMVC源码分析--ViewResolver视图解析器(一)和springMVC源码解析--ViewResolverComposite视图解析器集合(二)中我们已经简单介绍了一些 ...
- leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...
- leetcode 之 Single Number II
问题来源:Single Number II 问题描述:给定一个整数数组,除了一个整数出现一次之外,其余的每一个整数均出现三次,请找出这个出现一次的整数. 大家可能很熟悉另一个题目(Single Num ...
- 改善database schema
本文地址:http://blog.csdn.net/sushengmiyan/article/details/50422102 本文作者:苏生米沿 Hibernate 读取你java模型类的映射元数据 ...
- C实战:强大的程序调试工具GDB
C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...
- Linux 环境下一些常用的命令(二)
11. chown命令 "chown"命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样 ...