放书——算法作业 5.3,EOJ 2912

放书——算法作业 5.3,EOJ 2912


回溯

 1  #include  < stdio.h >
 2  #include  < string .h >
 3 
 4  #define   N  100
 5  #define   L  100000
 6 
 7  int  n, tmp, used[ N ], tot, ans[ L ];
 8 
 9  void  init() {
10          memset( used,  0 sizeof (used) );
11          tot  =   0 ;
12          tmp  =   0 ;
13  }
14 
15  void  dfs(  int  i ) {
16           int  j;
17           if  ( i  >  n ) {
18                   if  ( tot  <  L ) {
19                          ans[ tot ]  =  tmp;
20                  }
21                   ++ tot;
22                   return ;
23          }
24          tmp  *=   10 ;
25           for  ( j  =   1 ; j  <=  n;  ++ j ) {
26                   if  ( (used[j] == 0 &&  (j != i) ) {
27                          tmp  +=  j;
28                          used[ j ]  =   1 ;
29 
30                          dfs( i + 1  );
31 
32                          used[ j ]  =   0 ;
33                          tmp  -=  j;
34                  }
35          }
36          tmp  /=   10 ;
37  }
38 
39  void  fini() {
40           if  ( n  <   8  ) {
41                   int  i;
42                   for  ( i  =   0 ; i  <  tot;  ++ i ) {
43                          printf(  " %d\n " , ans[ i ] );
44                  }
45          }
46           else  {
47                  printf(  " %d\n " , tot );
48          }
49  }
50 
51  int  main() {
52           int  td;
53          scanf(  " %d " & td );
54           while  ( td --   >   0  ) {
55                  scanf(  " %d " & n );
56                  init();
57                   if  ( n  >   0  ) {
58                          dfs(  1  );
59                  }
60                  fini();
61          }
62           return   0 ;
63  }
64 

你可能感兴趣的:(放书——算法作业 5.3,EOJ 2912)