diff options
Diffstat (limited to 'alg_t.c')
-rw-r--r-- | alg_t.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ +#include <stdlib.h> +#include <assert.h> +#include <stdio.h> + +int main(int argv, char **argc) { + if (argv < 3) { + assert(argv > 0); + printf("Usage: %s [n] [t]\n", argc[0]); + return -1; + } + + size_t n = atoi(argc[1]), + t = atoi(argc[2]); + + assert(t < n); + + size_t *c = calloc(t + 3, sizeof(*c)); + +T1_initialize: + for (size_t j = 1; j <= t; j++) + c[j] = j - 1; + c[t + 1] = n; + c[t + 2] = 0; + + size_t j = t; + +T2_visit: + for (size_t k = t; k >= 1; k--) + printf("%lu ", c[k]); + printf("\n"); + + size_t x; + if (j > 0) { + x = j; + goto T6_increase_c_j; + } + +T3_maybe_easy_case: + if (c[1] + 1 < c[2]) { + c[1] = c[1] + 1; + goto T2_visit; + } else { + j = 2; + } + +T4_find_j: + c[j - 1] = j - 2; + x = c[j] + 1; + if (x == c[j + 1]) { + j = j + 1; + goto T4_find_j; + } + +T5_maybe_done: + if (j > t) return 0; + +T6_increase_c_j: + c[j] = x; + j = j - 1; + goto T2_visit; +} |