递归和排列
递归打印全排列
#include <bits/stdc++.h>
using namespace std;
// 交换也可以通话STL的swap函数 但是速度慢一点
#define Swap(a, b) \
{ \
int temp = a; \
a = b; \
b = temp; \
}
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 32, 15, 18, 33}; //本例只用到前10个数
int num = 0; //统计全排列的个数,判断是不是3628800
int Perm(int begin, int end)
{
int i;
if (begin == end) //递归结束,产生一个全排列
{ //如果有必要 在此打印或处理这个全面排列
num++; //统计全排列的个数
}
else
for (i = begin; i <= end; i++)
{
Swap(data[begin], data[i]); //把当前第1个数和后面的所有数交换位置
Perm(begin + 1, end);
Swap(data[begin], data[i]); //恢复,用于下一次交换
}
}
int main()
{
Perm(0, 9);
cout << num << endl;
}
打印n个数中任意m个数的全排列
例如在10个数中任取3个数的全排列,只需修改一个地方
if (begin == 3) //把Perm()函数中的end改为3 即可,其他不用动
{
cout << data[0] << " " << data[1] << " " << data[2] << endl;
num++; //统计全排列的个数 10*9*8=720
}