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);
}
}
}原文:http://blog.csdn.net/bcypxl/article/details/34159813