/***Perm.h*****/
#ifndef _ALGORITHM_PERM_H
#define _ALGORITHM_PERM_H
#include <windows.h>
//回调函数, 每个排列或组合的结果均做为参数传递给该函数
typedef void (*PERM_CALLBACK_PROC)(int nIndexArr[], int nArrLen, LPVOID lpUserData);
/**************************************************************************************
函数名称: PermNoRecurse
函数功能: 使用非递归算法对一个数组中的元素进行全排列,并访问每一种排列下的数组元素
参数列表:
nArrSize 数组元素个数
lpUserData 指向用户数组的首地址
call_back 执行每个排列结果的回调函数
返回值: 无
注解: 每个排列结果传递给回调函数call_back执行
***************************************************************************************/
void PermNoRecurse(int nArrSize, LPVOID lpUserData, PERM_CALLBACK_PROC call_back);
/// 求从数组a[1..n]中任选m个元素的所有组合。
/// a[1..n]表示候选集,m表示一个组合的元素个数。
/// 返回所有组合的总数。
/**************************************************************************************
函数名称: CombineNoRecurse
函数功能: 使用非递归回溯法从含有n个元素的数组中任选m个
参数列表:
nArrSize 数组元素总个数
nCombine 组合的元素个数
lpUserData 指向用户数组的首地址
call_back 执行每个组合结果的回调函数
返回值: 无
注解: 每个组合结果传递给回调函数call_back执行
***************************************************************************************/
void CombineNoRecurse(int nArrSize, int nCombine, LPVOID lpUserData, PERM_CALLBACK_PROC call_back);
#endif
/*****Perm.cpp*****/
#include "Perm.h"
//交换数组a中下标为i和j的两个元素的值
void swap(int* a,int i,int j)
{
a[i] ^= a[j];
a[j] ^= a[i];