void main() { int d[10], c[10]; int l, i; for (i = 0; i < 10; i++) c[i] = 2; l = 40; #define BEGIN_TRY(X) \ for (d[X] = c[X]; d[X] <= l; d[X]++) \ { int v = d[X] % 10, w = d[X] / 10; \ l -= d[X] + (w == 0); c[v]++; if (w > 0) c[w]++; \ if ((v > X || c[v] <= d[v]) && (w == 0 || w > X || c[w] <= d[w])) #define END_TRY(X) \ l += d[X] + (w == 0); c[v]--; if (w > 0) c[w]--; \ } BEGIN_TRY(0) BEGIN_TRY(1) BEGIN_TRY(2) BEGIN_TRY(3) BEGIN_TRY(4) BEGIN_TRY(5) BEGIN_TRY(6) BEGIN_TRY(7) BEGIN_TRY(8) BEGIN_TRY(9) { int f = 1; for (i = 0; i < 10 && f; i++) f = c[i] == d[i]; if (f) { for (i = 0; i < 10; i++) printf("%d ", d[i]); printf("\n"); } } END_TRY(9) END_TRY(8) END_TRY(7) END_TRY(6) END_TRY(5) END_TRY(4) END_TRY(3) END_TRY(2) END_TRY(1) END_TRY(0) }