#include <stdlib.h>
#include <stdio.h>
void swap(int *a, int i, int j)
{
if (i != j) {
int swap = a[i]; a[i] = a[j]; a[j] = swap;
}
}
int permute(int *a, int level, int n)
{
int res = 0;
if (level == n) {
if (a[0] && a[3] && a[6]) {
int k = a[0]*100 + a[1]*10 + a[2];
int l = a[3]*100 + a[4]*10 + a[5];
int m = a[6]*1000 + a[7]*100 + a[8]*10 + a[9];
if (k + l == m) {
printf("%d + %d == %d\n", k
,l
, m
); return 1;
}
}
} else {
int i;
for (i = level; i < n; i++) {
swap(a, level, i);
res += permute(a, level + 1, n);
swap(a, level, i);
}
}
return res;
}
int main(void)
{
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int n = permute(a, 0, 10);
printf("--\n%d solutions\n", n
);
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnZvaWQgc3dhcChpbnQgKmEsIGludCBpLCBpbnQgaikKewogICAgaWYgKGkgIT0gaikgewogICAgICAgIGludCBzd2FwID0gYVtpXTsgYVtpXSA9IGFbal07IGFbal0gPSBzd2FwOwogICAgfQp9CgppbnQgcGVybXV0ZShpbnQgKmEsIGludCBsZXZlbCwgaW50IG4pCnsKICAgIGludCByZXMgPSAwOwoKICAgIGlmIChsZXZlbCA9PSBuKSB7CiAgICAgICAgaWYgKGFbMF0gJiYgYVszXSAmJiBhWzZdKSB7CiAgICAgICAgICAgIGludCBrID0gYVswXSoxMDAgKyBhWzFdKjEwICsgYVsyXTsKICAgICAgICAgICAgaW50IGwgPSBhWzNdKjEwMCArIGFbNF0qMTAgKyBhWzVdOwogICAgICAgICAgICBpbnQgbSA9IGFbNl0qMTAwMCArIGFbN10qMTAwICsgYVs4XSoxMCArIGFbOV07CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoayArIGwgPT0gbSkgewogICAgICAgICAgICAgICAgcHJpbnRmKCIlZCArICVkID09ICVkXG4iLCBrLGwsIG0pOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0gICAgICAgICAgICAKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGludCBpOwoKICAgICAgICBmb3IgKGkgPSBsZXZlbDsgaSA8IG47IGkrKykgewogICAgICAgICAgICBzd2FwKGEsIGxldmVsLCBpKTsKICAgICAgICAgICAgcmVzICs9IHBlcm11dGUoYSwgbGV2ZWwgKyAxLCBuKTsKICAgICAgICAgICAgc3dhcChhLCBsZXZlbCwgaSk7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgYVtdID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OwoKICAgIGludCBuID0gcGVybXV0ZShhLCAwLCAxMCk7CiAgICBwcmludGYoIi0tXG4lZCBzb2x1dGlvbnNcbiIsIG4pOwoKICAgIHJldHVybiAwOwp9Cg==