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