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

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

代码:

#include <stdio.h>
#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<NUM;i++)  //设置彩票各位数字 
        num[i]=i+1;
    for(i=0;i<MAXN;i++)
        lottery[i]=0;
    combine(NUM,MAXN);    
	printf("%d",c);
    getch();
    return 0;
}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值