题目:给定1-n数字,排列组合。

解法:递归。第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出。用数组表示n个数字,用过的数字置0。

实现语言:C++

#include <iostream>
using namespace std; /************************************************************************/
/*
num : 需要排列的数组
count : 数组总数
numC: 已经排列的数组
iUse:已经排列的个数
iNull:置0的个数
sum: 总排列数
*/
/************************************************************************/
template <class T>
void ComBineNum(T *num, const int count, T *numC, int iUse, int* sum)
{
int iNull = 0;
T *newNum = new T[count];
for (int i = 0; i < count; ++i){
memcpy(newNum, num, count);
if (newNum[i] == 0){
++iNull;
if (iNull == count){
for (int i = 0; i < count; ++i){
cout << numC[i];
}
cout << endl;
++(*sum);
return;
}
continue;
}
numC[count - iUse] = newNum[i];
newNum[i] = 0;
ComBineNum(newNum, count, numC, iUse - 1, sum);
}
delete[] newNum;
} int main()
{
int sum = 0;
const int count = 4;
char num[count], pNum[count];
for (int i = 0; i < count; ++i){
num[i] = i + '1';
}
ComBineNum<char>(num, count, pNum, count, &sum);
cout << "sum :" << sum << endl; sum = 1;
for (int i = 1; i <= count; ++i){
sum *= i;
}
cout << "sum :" << sum << endl; return 0;
}

输出:

template <class T>
void Swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
} template <class T>
void Perm(T list[], int k, int m, int* count)
{
if (k == m){
for (int i = 0; i < m; ++ i){
cout << list[i];
}
cout << endl;
++(*count);
}
else{
for (int i = k; i < m; ++i){
Swap(list[k], list[i]);
Perm(list, k + 1, m, count);
Swap(list[i], list[k]);
}
}
} int main()
{
const int m = 4;
int count = 0;
int list[m];
for (int i = 0; i < m; ++i){
list[i] = i + 1;
} Perm(list, 0, m, &count);
cout << count;
return 0;
}

文/yanxin8原创,获取更多信息请访问http://yanxin8.com/261.html



算法:C++排列组合的更多相关文章

  1. cb47a_c++_STL_算法_排列组合next_prev_permutation

    cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...

  2. C#的排列组合类

    C#的排列组合类 //-----------------------------------------------------------------------------//// 算法:排列组合 ...

  3. C#排列组合类

    //----------------------------------------------------------------------------- // // 算法:排列组合类 // // ...

  4. 【AtCoder】AGC005 F - Many Easy Problems 排列组合+NTT

    [题目]F - Many Easy Problems [题意]给定n个点的树,定义S为大小为k的点集,则f(S)为最小的包含点集S的连通块大小,求k=1~n时的所有点集f(S)的和取模92484403 ...

  5. 【CodeForces】889 C. Maximum Element 排列组合+动态规划

    [题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...

  6. 排列组合算法(PHP)

    用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...

  7. C#语法灵活运用之排列组合算法

    今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合. 如指定字母a.b.c.d.e.f,长度为2,则结果应为:aa.ab.ac ... ef.ff. 有朋友给出算法,很有特色: ...

  8. N个数组中所有元素的排列组合(笛卡尔积)算法

    (1)N个数组对象中所有元素排列组合算法 private List<List<Object>> combineAlg(List<Object[]> nArray) ...

  9. python算法-排列组合

    排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...

  10. HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)

    传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...

随机推荐

  1. 【LeetCode】14. Longest Common Prefix 最长前缀子串

    题目: Write a function to find the longest common prefix string amongst an array of strings. 思路:求最长前缀子 ...

  2. MSP430F149学习之路——时钟2

    代码一: /************************** 功能:LED每隔1秒闪烁一次 ****************************/ #include <msp430x14 ...

  3. 洛谷P2725 邮票 Stamps

    P2725 邮票 Stamps 37通过 224提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 为什么RE?在codevs上AC的. 题目背景 给一组 ...

  4. java 学习之(基本语法)

    强类型:1所有变量必须先定义,再使用.2变量所赋值必须为与其类型匹配的类型. 标识符与关键字   分隔符:;{},[],() space .  用法与.net一样 标识符规则:以_  字母 $符开头 ...

  5. sql case when 多条件

    when  'ChangeProductName'=   case  --联名借姓名    --when  a.ChangeProductName is not null   then (substr ...

  6. Linux:两台服务器之间添加信任关系,进行远程操作的时候不需要输入密码

    两台机器之间建立信任关系的步骤: 1. 在机器1上root用户执行ssh-keygen命令,生成建立安全信任关系的证书,直接Enter [root@CentOS64-x64 ~]# ssh-keyge ...

  7. npm命令大全

    参考网站:https://docs.npmjs.com/ 有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. npm 常用命令 npm install <name ...

  8. C++ builder 操作Excel方法(据网上资料整理)

    c++ builder 操作Excel方法,下面是从网上找到的一些不错的方法,学习一下: 用OLE操作Excel(目前最全的资料)(04.2.19更新) 本文档部分资料来自互联网,大部分是ccrun( ...

  9. 背景图片background-size兼容ie8以下浏览器解决

    背景图片不够大,然后就想到用background-size:100%; 测试浏览器的时候发现ie8以下不兼容,图片会自动填充平铺过去,然后出现背景不好看的现象.解决方法: background-ima ...

  10. HTTP长连接200万尝试及调优

    对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一.这种应用常见于消息推送系统,也称为 ...