题目:给定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. 下一代大数据系统和4S标准

    大数据行业发展到今天,它创造的价值和带来的社会效应,大家已经看得很明白,同时很多问题和不足也暴露出来,特别是hadoop能够提供的数据处理能力,现在已经挖掘到极限,但是现在各行业对数据的存储和计算需求 ...

  2. 紧张:飞测独家のJmeter秘籍,限量发放

    飞测说:数月前,小怪我牺牲了周末时间,做了fiddler的扩展开发,从fiddler将请求导出,保存为jmx格式的文件,然后使用jmeter来调用.随后,小怪和同事(心&阳)一同研究jmete ...

  3. Markdown 编辑器语法指南

    基本技巧 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` 实现 通常编辑器根据代码片段适配合适的高亮方法,但你也可以用 ``` 包裹一段代码,并指定一种语 ...

  4. EF调用存储过程遇到的问题

    注意 实体类Statistics的字段名和存储过程返回集合的列名要相同才行

  5. leetcode279. Perfect Squares

    learn from DP class Solution { public: int numSquares(int n) { if(n<=0)return 0; int * dp = new i ...

  6. 理解DOM中的事件流

    浏览器发展到第四代时(IE4和Netscape Communicator 4),浏览器团队遇到一个很有意思的问题:页面的哪一部分会拥有特定的事件?想象下在一张纸上有一组同心圆,如果你把手指放在圆心上, ...

  7. Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

    本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...

  8. repeater标签双重循环的使用

    在网站开发中,.NET中的repeater标签几乎是笔者首选,也是唯一一个不会生成多余元素的标签,所有样式都是自定义的,这点类似 struts中的<s:iterator/>标签. 在日常编 ...

  9. u-boot board_uart_init流程

    /** ****************************************************************************** * @author    Maox ...

  10. [转]从两道经典试题谈C/C++中联合体(union)的使用

    宋宝华 21cnbao sweek@21cn.com 试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式? 分析: 作为一个计算机相关专业的人,我们应该在计 ...