代码能力实在是不够,自己写不来不说,看个代码都看了好久,终于看明白了,决定写出来,这样或许会加深理解:
题目:生成一个四位的彩票,每位是从1到7的任意数字,要求是每位之间不能重复。
原书中说这是回溯算法的一个例子,我个人感觉可能是因为这是逐层的调用自己,当一位的彩票使用完了之后,返回到之前一位,改变之,然后在继续改变后一位。
题目:生成一个四位的彩票,每位是从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;
}
原书中说这是回溯算法的一个例子,我个人感觉可能是因为这是逐层的调用自己,当一位的彩票使用完了之后,返回到之前一位,改变之,然后在继续改变后一位。