码迷,mamicode.com
首页 > 其他好文 > 详细

全排列

时间:2014-06-25 08:18:22      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:c++   算法   递归   

1.题目:输入一个字符串,打印出该字符串中字符的所有排列。

例如输入字符串 abc,则输出由字符 a、b、c  所能排列出来的所有字符串

abc、acb、bac、bca、cab  和 cba。

 

//一种递归实现

void Permutation(char* pStr, char* pBegin)
{
	if (*pBegin == '\0')
		puts(pStr);
	else
	{
		for (char* pCh = pBegin; *pCh != '\0'; ++pCh)
		{
			char chTmp = *pCh;
			*pCh = *pBegin;
			*pBegin = chTmp;

			Permutation(pStr, pBegin + 1);

			chTmp = *pCh;
			*pCh = *pBegin;
			*pBegin = chTmp;
		}
	}
}

int Permutation(char* pStr)
{
	int nRet = 0;
	if (pStr == NULL)
	{
		nRet = -1;
		printf("param input error!\n");
		return nRet;
	}

	Permutation(pStr, pStr);
	return nRet;
}

//for(char* pCh = pBegin; *pCh != '\0'; ++pCh);
//FUCK的在这里加了一个 ;(语句结束的符号),
//怎么调试都出现怪异的情况,程序崩溃,而且走到
//for循环里面会报出pCh未定义,而且跟踪断点,发现pStr,pBegin
//指向的字符串都为空值。这说明作用域结束,出栈了。
//以后再次碰到这种情况要想想是不是语法哪里错了。
//而且这种错误最坑爹的是编译器检查不出来!

//另一种递归实现
void CalcAllPermutation(char perm[], int first, int num)
{
	if (num <= 1)  //刚开始写成了num < 1也是可以的,出结果了,很正确
	{
		puts(perm);
		return;
	}

	else
	{
		for (int i = first; i < first + num; ++i)
		{
			swap(perm[i], perm[first]);
			CalcAllPermutation(perm, first + 1, num - 1);
			swap(perm[i], perm[first]);
		}
	}
}


 

关于num < 1也是可以的,出结果了,很正确。如果num=1时还可以继续下面的循环递归,此时first=3,num=0,i<first+num(3<3)不成立,然后退出这一层递归。这相当于多执行了for循环中的条件判断操作!

 

2.题目:求组合数:求N个数(1...n)中K个数的组合....如:

Combination(5,3)

要求输出:543,542,541,532,531,521,432,431,421,431

 

int stack[3] = { 0 };
int top = -1;

bool pop(int* nNum)
{
	*nNum = stack[top--];
	if (top >= 0)
		return false;
	else
		return true;
}

bool push(int nNum)
{
	stack[++top] = nNum;
	if (top < 2)
		return false;
	else
		return true;
}

void Combination(int n, int m)
{
	int temp = n;
	push(temp);
	while (1)
	{
		if (1 == temp)
		{
			if (pop(&temp) && stack[0] == m)
				break;
		}
		else if (push(--temp))
		{
			printf("%d%d%d  ", stack[0], stack[1], stack[2]);
			pop(&temp);
		}
	}
}


全排列,布布扣,bubuko.com

全排列

标签:c++   算法   递归   

原文地址:http://blog.csdn.net/bcypxl/article/details/34159813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!