一个集合的算法问题的解决

来源:互联网 发布:卖淘宝小号的 编辑:程序博客网 时间:2024/06/05 10:25

qszhoufuge那里看到“一个集合的算法问题”题目如下:

    设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:1 2,1 3,1 4,2 3, 2 4,3 4。

    早上在家的时候随手写了一个用循环解决的,因为没环境测试,下午有时间的时候测试发现错了,哈哈。非常抱歉啊。

    后来一想,其实这个不难,用递归可以很好解决,于是乎就静下心来思考,其实用递归实现真的不复杂,这次终于一次性通过了,^_^

    实现算法如下(经过测试的):

#include <stdio.h>

//显示组合
//nCount:组合的个数
//p:数组指针
inline void p2s(int nCount,int *p)
{
         for (int i = 0;i<nCount;++i)
         {
                  printf("/t%d",*(p + i));
         }

         printf("/r/n");
}

//递归组合
//nStart 开始数
//nMax: 最大数值
//nCount:组合的个数
//nIndex:组合索引(组合中的第几个数,0开始)
//p:数组指针
void func0(int nStart,int nMax,int nCount,int nIndex,int * p)
{
         for (int i = nStart;i< nMax - nCount + nIndex + 2;i++)
         {
                  *(p + nIndex) = i;
                  if (nCount - 1 == nIndex)
                  {
                           p2s(nCount,p);
                  }
                  else
                  {
                           func0(i + 1,nMax,nCount,nIndex + 1,p);
                  }
        } 
}

//组合算法
//n:范围:1~n
//nCount:组合的个数
void func(int n,int k)
{
         int* p = new int[k];
         func0(1,n,k,0,p);
}

int _tmain(int argc, _TCHAR* argv[])
{
         func(4,2);
         getchar();//等待退出
         return 0;
}

原创粉丝点击