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

 

  1. #include <stdio.h> 
  2. #define MAXN 4 //设置每一注×××的位数  
  3. #define NUM 7 //设置组成×××的数字  
  4. int num[NUM]; 
  5. int lottery[MAXN]; 
  6. int c=0; 
  7. void combine(int n, int m)//最外层的循环,从i=n=7开始,每位数字个数>=位数,所以又i>=m。(一位的×××至少要有一个数字) 
  8.      
  9.      int i,j; 
  10.      for(i=n;i>=m;i--) 
  11.      { 
  12.          lottery[m-1]=num[i-1]; //将第7个数字赋给×××的第4位(从高位开始赋值)  
  13.          if (m>1)//如果后面还有空位没有赋值,则再次调用此函数,继续向后赋值 
  14.              combine(i-1,m-1); 
  15.             //上面这句将×××位数变为3位,每位6个数字;逐层调用,直到最后×××成为一位,该为4个数字 
  16.          else//m = 1;说明已经到达最后一位,输出前面3位和最后一位  
  17.          { 
  18.              for(j=MAXN-1;j>=0;j--) 
  19.                  printf("%3d",lottery[j]); 
  20.              c++; 
  21.              printf("\n"); 
  22.          } 
  23.      } 
  24. int main() 
  25.     int i,j; 
  26.     for(i=0;i<NUM;i++)  //设置×××各位数字  
  27.         num[i]=i+1; 
  28.     for(i=0;i<MAXN;i++) 
  29.         lottery[i]=0; 
  30.     combine(NUM,MAXN);     
  31.     printf("%d",c); 
  32.     getch(); 
  33.     return 0; 
原书中说这是回溯算法的一个例子,我个人感觉可能是因为这是逐层的调用自己,当一位的×××使用完了之后,返回到之前一位,改变之,然后在继续改变后一位。