程序代码:
#include <stdio.h>
// m选n中, n的数组 选n 总数: m
int next_combination(int* pArray, int nLen, int nSel)
{
if (pArray[nLen - 1] + 1 < nSel) //处理靠右边
{
++pArray[nLen - 1];
return 1;
}
else
{
int it = 2;
while (it <= nLen &&
pArray[nLen - it] + it == nSel) //饱和点,一般从中间向右边靠,不单判断程序是否结束,而且提供辅助
++it;
if (it <= nLen)
{
int i;
pArray[nLen - it]++;
for (i = nLen - it + 1; i < nLen; ++i ) //从左向靠n修正数据,IT越大,靠左边越明显,IT越少,向中间明显一点
pArray[i] = pArray[i - 1] + 1;
return 1;
}
else
{
return 0;
}
}
}
int main()
{
int arrmap[] = {1, 2, 3, 4, 5,6};
int arr[20];
int len = 6, i; //len相当于被选中个数
for (i = 0; i < len; ++i) arr[i] = i; //初始化数组
do //枚举组合的循环
{
for (i = 0; i < len; ++i) //打印组合
{
printf("%d ", arr[i]);
}
puts("");
} while ( next_combination(arr, len, sizeof(arrmap) / sizeof(int)) ); //获取下一个组合
// m选n中, n的数组 n m
scanf("%*s");
return 0;
}
仔细考虑发觉很巧妙
,我不防加得注释,让大家看明白一点
,程序思路就是首先右边不断自加量
如果右边平衡,就开始中间,慢慢向左边,而且数据不断修正,重复之前动作,直到两边平衡,就结束程序
[
本帖最后由 点线面 于 2011-1-4 23:35 编辑 ]