回溯算法中彩票生成算法的分析

代码能力实在是不够,自己写不来不说,看个代码都看了好久,终于看明白了,决定写出来,这样或许会加深理解:
题目:生成一个四位的彩票,每位是从1到7的任意数字,要求是每位之间不能重复。

代码:

#include 
#define MAXN 4 //设置每一注彩票的位数 
#define NUM 7 //设置组成彩票的数字 
int num[NUM];
int lottery[MAXN];
int c=0;
void combine(int n, int m)//最外层的循环,从i=n=7开始,每位数字个数>=位数,所以又i>=m。(一位的彩票至少要有一个数字)
{
     int i,j;
     for(i=n;i>=m;i--)
     {
         lottery[m-1]=num[i-1]; //将第7个数字赋给彩票的第4位(从高位开始赋值) 
         if (m>1)	//如果后面还有空位没有赋值,则再次调用此函数,继续向后赋值 
             combine(i-1,m-1);
             //上面这句将彩票位数变为3位,每位6个数字;逐层调用,直到最后彩票成为一位,该为4个数字 
         else//m = 1;说明已经到达最后一位,输出前面3位和最后一位  
         {
             for(j=MAXN-1;j>=0;j--)
                 printf("%3d",lottery[j]);
             c++;
             printf("\n");
         }
     }
}
int main()
{
    int i,j;
    for(i=0;i

原书中说这是回溯算法的一个例子,我个人感觉可能是因为这是逐层的调用自己,当一位的彩票使用完了之后,返回到之前一位,改变之,然后在继续改变后一位。

你可能感兴趣的:(C/C++,算法)