1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | #include "Combination.h" |
13 | |
14 | using namespace std; |
15 | |
16 | Combination::Combination (int npar) { |
17 | n = npar; |
18 | maxCombi = 0; |
19 | if (n < 2) return; |
20 | if (n >= MAXCOMBI32) return; |
21 | combi = new unsigned char [n]; |
22 | iCombi = 0; |
23 | maxCombi = calcMaxCombi (); |
24 | list = new unsigned char [maxCombi * n]; |
25 | if (n & 1) oddCombi (); |
26 | else allCombi (0, 0); |
27 | } |
28 | |
29 | void Combination::getCombi (int i) { |
30 | memcpy (combi, list + (i * n), n); |
31 | } |
32 | |
33 | void Combination::oddCombi () { |
34 | for (int i = 0; i < n; i++) { |
35 | combi [n-1] = i; |
36 | allCombi (1 << i, 0); |
37 | } |
38 | } |
39 | |
40 | void Combination::allCombi (int used, int deep) { |
41 | int nrem = n - 2 * deep - (n & 1); |
42 | int remain [nrem]; |
43 | int irem = 0; |
44 | for (int i = 0; i < n; i++) |
| 1 | Loop condition is false. Execution continues on line 48 | |
|
45 | if ( ! ( (1 << i) & used ) ) |
46 | remain [irem++] = i; |
47 | |
48 | combi [deep*2] = remain [0]; |
| 2 | | Assigned value is garbage or undefined |
|
49 | for (int j = 1; j < nrem; j++) { |
50 | combi [deep*2+1] = remain [j]; |
51 | int xused = (1 << remain [0]) | (1 << remain [j]) | used ; |
52 | if (nrem >= 4) |
53 | allCombi (xused, deep + 1); |
54 | else { |
55 | memcpy (list + (iCombi++) * n , combi, n); |
56 | } |
57 | } |
58 | } |
59 | |
60 | int Combination::calcMaxCombi () { |
61 | int max = 1; |
62 | int nn = n; |
63 | if (! (nn & 1)) nn--; |
64 | while (nn > 0) { |
65 | max *= nn; |
66 | nn -= 2; |
67 | } |
68 | return (max); |
69 | } |
70 | |