#include <stdio.h>
#include <stdlib.h>
void combinations(int **sets, int *sizes, int *indices, int n, int depth, int *output, int *count) {
if (depth == n) {
// base case: we have selected one element from each set
// print the combination
for (int i = 0; i < n; i++) {
printf("%d", sets
[i
][indices
[i
]]); }
// add the combination to the output array
for (int i = 0; i < n; i++) {
output[*count * n + i] = sets[i][indices[i]];
}
(*count)++;
return;
}
// recursive case: select one element from the current set and move on to the next set
for (int i = 0; i < sizes[depth]; i++) {
indices[depth] = i;
combinations(sets, sizes, indices, n, depth + 1, output, count);
}
}
int main() {
int n = 2;
int *sizes
= malloc(n
* sizeof(int)); sizes[0] = 3;
sizes[1] = 2;
int **sets
= malloc(n
* sizeof(int *)); sets
[0] = malloc(3 * sizeof(int)); sets[0][0] = 1;
sets[0][1] = 2;
sets[0][2] = 3;
sets
[1] = malloc(2 * sizeof(int)); sets[1][0] = 2;
sets[1][1] = 5;
int *indices
= calloc(n
, sizeof(int)); int count = 0;
int *output
= malloc(n
* sizes
[0] * sizes
[1] * sizeof(int)); combinations(sets, sizes, indices, n, 0, output, &count);
printf("Total combinations: %d\n", count
); for (int i = 0; i < count; i++) {
for (int j = 0; j < n; j++) {
printf("%d", output
[i
* n
+ j
]); }
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnZvaWQgY29tYmluYXRpb25zKGludCAqKnNldHMsIGludCAqc2l6ZXMsIGludCAqaW5kaWNlcywgaW50IG4sIGludCBkZXB0aCwgaW50ICpvdXRwdXQsIGludCAqY291bnQpIHsKICAgIGlmIChkZXB0aCA9PSBuKSB7CiAgICAgICAgLy8gYmFzZSBjYXNlOiB3ZSBoYXZlIHNlbGVjdGVkIG9uZSBlbGVtZW50IGZyb20gZWFjaCBzZXQKICAgICAgICAvLyBwcmludCB0aGUgY29tYmluYXRpb24KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgc2V0c1tpXVtpbmRpY2VzW2ldXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAvLyBhZGQgdGhlIGNvbWJpbmF0aW9uIHRvIHRoZSBvdXRwdXQgYXJyYXkKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBvdXRwdXRbKmNvdW50ICogbiArIGldID0gc2V0c1tpXVtpbmRpY2VzW2ldXTsKICAgICAgICB9CiAgICAgICAgKCpjb3VudCkrKzsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAvLyByZWN1cnNpdmUgY2FzZTogc2VsZWN0IG9uZSBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgc2V0IGFuZCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNldAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplc1tkZXB0aF07IGkrKykgewogICAgICAgIGluZGljZXNbZGVwdGhdID0gaTsKICAgICAgICBjb21iaW5hdGlvbnMoc2V0cywgc2l6ZXMsIGluZGljZXMsIG4sIGRlcHRoICsgMSwgb3V0cHV0LCBjb3VudCk7CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW50IG4gPSAyOwogICAgaW50ICpzaXplcyA9IG1hbGxvYyhuICogc2l6ZW9mKGludCkpOwogICAgc2l6ZXNbMF0gPSAzOwogICAgc2l6ZXNbMV0gPSAyOwogICAgaW50ICoqc2V0cyA9IG1hbGxvYyhuICogc2l6ZW9mKGludCAqKSk7CiAgICBzZXRzWzBdID0gbWFsbG9jKDMgKiBzaXplb2YoaW50KSk7CiAgICBzZXRzWzBdWzBdID0gMTsKICAgIHNldHNbMF1bMV0gPSAyOwogICAgc2V0c1swXVsyXSA9IDM7CiAgICBzZXRzWzFdID0gbWFsbG9jKDIgKiBzaXplb2YoaW50KSk7CiAgICBzZXRzWzFdWzBdID0gMjsKICAgIHNldHNbMV1bMV0gPSA1OwogICAgaW50ICppbmRpY2VzID0gY2FsbG9jKG4sIHNpemVvZihpbnQpKTsKICAgIGludCBjb3VudCA9IDA7CiAgICBpbnQgKm91dHB1dCA9IG1hbGxvYyhuICogc2l6ZXNbMF0gKiBzaXplc1sxXSAqIHNpemVvZihpbnQpKTsKICAgIGNvbWJpbmF0aW9ucyhzZXRzLCBzaXplcywgaW5kaWNlcywgbiwgMCwgb3V0cHV0LCAmY291bnQpOwogICAgcHJpbnRmKCJUb3RhbCBjb21iaW5hdGlvbnM6ICVkXG4iLCBjb3VudCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBwcmludGYoIiVkIiwgb3V0cHV0W2kgKiBuICsgal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICBmcmVlKHNpemVzKTsKICAgIGZyZWUoc2V0c1swXSk7CiAgICBmcmVlKHNldHNbMV0pOwogICAgZnJlZShzZXRzKTsKICAgIGZyZWUoaW5kaWNlcyk7CiAgICBmcmVlKG91dHB1dCk7CiAgICByZXR1cm4gMDsKfQo=