生成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特征图的 ...
随机推荐
- Gradle--初识
1.Eclipse从svn导入Gradle项目 1.检出项目的时候不要选新项目,选"做为工作空间中的项目检出",然后点Finish. 2.将项目转为Gradle项目,右键导入的项目 ...
- SQL执行SQL语句提示 "内存不足"(insufficient memory....)的解决方法
由于本地执行的sql script的文件太大但是本地sql的运行内存有限,当我在MSSql的工具上运行这份178M左右的脚本的时候 它会提示 如下错误(Insufficient memory to c ...
- Ubuntu搭建owncloud10
前言: 在此我先吐槽一下.用Centos系统简直是为难我自己,是看到那个系统 感到无比的绝望. 正文: 自己在虚拟机中搭建Ubuntu系统.这里就不说了 安装好之后自己换源.建议的源: 清华源: # ...
- Docker 列出镜像
使用 docker images 显示本地已有的镜像. $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu ...
- [CSDN_Markdown] 使用LaTeX写矩阵
简介 LaTeX 的公式功能非常强大,一次性讲全不是件容易的事情.将LaTeX 的这些功能分成较小的相互独立的部分来讲,一方面方便大家单独查阅:另一方面,所有[CSDN_Markdown]相关的文章都 ...
- [CSDN_Markdown] 使用CSDN Markdown编辑器
简介 最近CSDN支持Markdown语法写博客了,甚是欢喜.前几天写了一篇实验了下,感觉不错.准备写几篇文章介绍一下如何使用CSDN的Markdown编辑器写博客,不求全面,但求够用,望大家批评指正 ...
- 剑指Offer——“你最大的缺点是什么”回答技巧及范例
剑指Offer--"你最大的缺点是什么"回答技巧及范例 问题分析:认识自己的缺点是一个巨大的优点, 当HR问到你缺点的时候, 你的机会来了, 请快展示你的自知之明吧!你想把优点 ...
- 查看4k对齐,激活.net framework 3.5
查看是否4k对齐 Win+R,打开运行窗口,在窗口中输入“msinfo32",组件”--“存储”--“磁盘”.然后可以在右边栏看到“分区起始偏移”,我们图例中有2个数值,分别是:32256字 ...
- 使用C++将OpenCV中Mat的数据写入二进制文件,用Matlab读出
在使用OpenCV开发程序时,如果想查看矩阵数据,比较费劲,而matlab查看数据很方便,有一种方法,是matlab和c++混合编程,可以用matlab访问c++的内存,可惜我不会这种方式,所以我就把 ...
- Windows安装和使用fftw
FFTW是一个比较快的.非常出名的一个DFT的开源库. 本文探索安装和配置FFTW,用Visual Studio 2008来使用fftw. 第一步:下载最新的fftw库 这一步很简单,只要在googl ...