`

排列组合的实现

阅读更多

简单算法:

从前往后(或者从后往前)每次交换一个位置。当存在一个到达最后位置时,需要调整整个数组的位置。将所有的0(1)的位置向后整体移动一位。

直到结束。

 

 

#include <iostream>
#include <assert.h>
#include <new>
using namespace std;

void PrintArr(const int* pnArr, const int nLen);
int Combin(const int m, const int n);
bool IsEndofCombin(const int* pnArr, const int m, const int n);
bool ChangeArr(int* pnArr, const int m, const int n);

int main()
{
	int m = 0;
	int n = 0;

	while (true)
	{
		cout << "please input m:";
		cin >> m;

		cout << "please input n:";
		cin >> n;

		Combin(m, n);
	}

	return 0;
}

void PrintArr(const int* pnArr, const int nLen)
{
	assert(pnArr && nLen > 0);

	int i = 0;
	for (i = 0; i < nLen; i++)
	{
		if (pnArr[i] > 0)
		{
			cout << char('A' + i);
		}
	}

	cout << endl;
}

bool IsEndofCombin(const int* pnArr, const int m, const int n)
{
	assert(pnArr && m > 0 && n > 0 && m >= n);
	bool bResvr = n > m / 2 ? true : false;

	if (m == n)
	{
		return false;
	}

	int i = 0;
	if (bResvr)
	{
		for (i = 0; i < m - n; i++)
		{
			if (pnArr[i] > 0)
			{
				return false;
			}
		}
	}
	else
	{
		for (i = n; i < m; i++)
		{
			if (pnArr[i] < 0)
			{
				return false;
			}
		}
	}

	return true;
}

bool AdjustArr(int* pnArr, const int m, const int n)
{
	assert(pnArr && m > 0 && n > 0 && m >= n);

	if (m == n)
	{
		return false;
	}

	bool bResvr = n > m / 2 ? true : false;
	int i = 0;
	int j = 0;

	if (bResvr)
	{
		for (i = 0; i < m - n; i++)
		{
			if (pnArr[i] > 0)
			{
				break;
			}
		}

		//如果交换完成
		if (i >= m -n )
		{
			return false;
		}

		//开始交换
		if (pnArr[0] > 0)
		{
			return false;
		}

		//找到需要移动的位置,从此位置向前移动一位
		for (i = m - 1; i >= 0; i--)
		{
			if (pnArr[i] <= 0)
			{
				break;
			}
		}

		for (j = 0; j < m; j++)
		{
			pnArr[j] = 1;
		}

		for (j = 0; j < m - n; j++)
		{
			pnArr[--i] = 0;
		}

		return true;
	}
	else
	{
		for (i = 0; i < m - n; i++)
		{
			if (pnArr[m - i - 1] <= 0)
			{
				break;
			}
		}

		//交换完毕
		if (i >= m - n)
		{
			return false;
		}

		//开始交换
		if (pnArr[m - 1] <= 0)
		{
			return false;
		}

		//找到需要移动的位置,从此位置向后移动一位
		for (i = 0; i < m; i++)
		{
			if (pnArr[i] > 0)
			{
				break;
			}
		}

		for (j = 0; j < m; j++)
		{
			pnArr[j] = 0;
		}

		for (j = 0; j < n; j++)
		{
			pnArr[++i] = 1;
		}

		return true;
	}

	return true;
}

bool ChangeArr(int* pnArr, const int m, const int n)
{
	assert(pnArr && m > 0 && n > 0 && m >= n);

	if (m == n)
	{
		return false;
	}

	bool bResvr = n > m / 2 ? true : false;
	int i = 0;
	int nPlace = 0;
	int nTime = 0;

	if (bResvr)
	{
		nPlace = 0;
		for (nTime = 0; nTime < m - n; nTime++)
		{
			for (i = nPlace; i < m; i++)
			{
				if (pnArr[i] <= 0)
				{
					//change
					if (i > nPlace)
					{
						int nTmp = pnArr[i];
						pnArr[i] = pnArr[i - 1];
						pnArr[i - 1] = nTmp;

						return true;
					}
					else
					{
						nPlace++;
						break;
					}
				}

			}
		}
	}
	else
	{
		nPlace = m - 1;
		for (nTime = 0; nTime < m - n; nTime++)
		{
			for (i = nPlace; i >= 0; i--)
			{
				if (pnArr[i] > 0)
				{
					//change
					if (i < nPlace)
					{
						int nTmp = pnArr[i];
						pnArr[i] = pnArr[i + 1];
						pnArr[i + 1] = nTmp;

						return true;
					}
					else
					{
						nPlace--;
						break;
					}
				}
			}
		}
	}

	return false;
}

//get n combin from m numbers
int Combin(const int m, const int n)
{
	assert(m > 0 && n > 0 && m >= n);

	int* pnArr = new(nothrow) int[m];
	if (NULL == pnArr)
	{
		return -1;
	}

    //int aray
	memset(pnArr, 0, sizeof(int) * m);

	int i = 0;

	for (i = 0; i < m; i++)
	{
		pnArr[i] = i < n ? 1 : 0;
	}

	int nCount = 0;

	PrintArr(pnArr, m);
	nCount++;

	while (true)
	{
		if (!ChangeArr(pnArr, m, n))
		{
			cout << "total count:" << nCount << endl;
			break;
		}

		PrintArr(pnArr, m);
		nCount++;

		//adjust value
		if (AdjustArr(pnArr, m, n))
		{
			PrintArr(pnArr, m);
			nCount++;
		}
	}

	return 0;
}
 

 

 

 

分享到:
评论

相关推荐

    qtc++排列组合实现

    3. **C++中的组合实现** - 对于组合,可以使用回溯法或动态规划。回溯法是一种试探性的解决问题方法,当发现某一步选择不正确时,退回一步重新选择。 - 示例代码(回溯法): ```cpp void combination(int start...

    PHP实现多种类型的排列组合算法

    下面将详细讨论PHP如何实现排列组合算法。 首先,排列和组合是离散数学中的基本概念。排列是指从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,形成不同的排列方式。组合则是指从n个不同元素中不考虑...

    C#实现排列组合算法完整实例

    在C#编程中,排列组合算法是解决许多数学和计算机科学问题的基础,特别是在处理数据排序、统计计算以及算法设计时...无论哪种实现方式,理解和掌握排列组合的基本概念及其在C#中的实现,对于提升编程能力具有重要意义。

    排列组合-插入算法

    本篇我们将关注一种称为“插入算法”的排列组合实现。 首先,我们需要理解插入算法的基本思想。插入算法是一种基于回溯的策略,它从最简单的排列(如123...n)开始,然后通过插入一个尚未使用的元素来生成新的排列...

    java m取n 重复 不重复 排列组合 for循环嵌套递归

    ### Java中m取n排列组合实现 #### 一、背景介绍 在计算机科学中,排列组合是一个重要的概念,在很多算法设计中都会用到。比如密码学中的密钥生成、信息安全中的数据加密等场景都可能涉及到这一概念。在Java编程语言...

    排列组合算法实现

    排列组合算法实现,支持模板类。支持重复数的排列。算法采用递归方法,简单易懂。

    算法 排列组合生成器 后端

    2. **业务逻辑层**:实现排列组合的生成算法,可能包括回溯法、动态规划或者Bitmask等高效策略。 3. **数据访问层**:通过Spring Data JPA或JdbcTemplate与H2数据库交互,存储和检索排列组合数据。 4. **筛选功能**...

    Java排列组合算法分析和代码实现

    在编程领域,排列组合是算法设计中的重要组成部分,特别是在数据结构和算法的课程中,以及在解决实际问题如路径搜索、图论问题等时经常用到。本资源深入讲解了如何在Java中实现这两种基本算法。 首先,让我们来理解...

    从n个数组中取出所有排列组合(Java实现)

    总结来说,从n个数组中取出所有排列组合的Java实现涉及到递归算法、回溯法以及数据结构的操作。理解这些概念并能够熟练运用是成为一名优秀程序员的关键。通过这个例子,我们可以看到如何利用Java的灵活性和表达力来...

    排列组合软件(任意字符、关键字全排,txt输出)

    排列组合软件是一种用于生成所有可能的字符或关键字排列组合的工具,主要应用于数据分析、文本处理以及在本例中提到的电子商务领域,如淘宝直通车的关键词优化。这种软件可以帮助用户快速生成大量的组合,以便进行...

    基于c语言排列组合算法

    今天,我们将讨论基于C语言的排列组合算法实现。 一、全排列算法 全排列算法是指生成所有可能的排列的算法。常见的全排列算法有递归算法、分治算法和迭代算法等。在这里,我们将讨论基于C语言的递归算法实现。 1....

    c语言排列组合

    小小wintc程序 计算排列组合代吗 用递归写的 呵呵

    c语言实现的排列组合程序

    本文将详细探讨如何使用C语言来实现排列组合算法,并结合递归解决P(m,n)问题。 首先,我们要理解排列和组合的基本概念。排列是指从n个不同元素中取出m个元素,按照一定的顺序进行排列,其数量由阶乘表示,即P(m,n) ...

    基于hadoop用并行递归实现排列组合运算

    ### 基于Hadoop用并行递归实现排列组合运算 #### 背景介绍与问题描述 在计算机科学领域,数字排列组合是经典的算法问题之一,它不仅通俗易懂,而且对于初学者来说非常友好。通过这个问题的学习,我们可以很好地...

    Python实现排列组合生成算法

    排列组合生成算法的python实现。实现方法参考了维基百科中的combination和permutation词条。 使用方法: python combinations.py #按字典序生成6中选3的组合(数字代码中可以调整) python arrangement.py #按字典序...

    计算数字排列组合,任意数字的组合。

    3. **算法实现**:在编程中,常用递归或动态规划方法实现排列组合的计算。例如,回溯法是一种常用的求解排列问题的算法,它通过尝试所有可能的分支并在不适合时回溯。而动态规划则常用于优化组合计数,避免重复计算...

    排列组合练习数据

    排列组合是离散数学中的重要概念,主要研究的是在有限集合中进行无序或有序的选择问题。在本压缩包“排列组合练习数据”中,包含了相关的测试题目,旨在帮助学习者深入理解和掌握这一主题。排列关注的是元素的顺序,...

    易语言数字排列组合源码

    在本主题中,"易语言数字排列组合源码" 是一个关于使用易语言实现数字排列组合计算的代码示例。排列组合是组合数学中的基本概念,广泛应用于各种算法设计和数据分析中。 排列是指从n个不同元素中取出m(m≤n)个...

    排列组合有重复

    排列组合有重复 本资源主要讨论排列组合问题,特别是具有重复元素的排列组合...本资源的内容丰富、详细,涵盖了排列组合问题的定义、回溯算法的应用、实验设计和实现、实验结果和分析等方面的内容,供读者学习和参考。

Global site tag (gtag.js) - Google Analytics