From 5978cc86c5807a7fe36cba8a227c0001ecaa66d6 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Thu, 14 Sep 2017 20:45:22 +1200 Subject: Improve algorithm for permutations --- words-misc/permutations.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/words-misc/permutations.c b/words-misc/permutations.c index 4fafde0..7f6b0ef 100644 --- a/words-misc/permutations.c +++ b/words-misc/permutations.c @@ -2,42 +2,42 @@ #include #include -/* FIXME hacked together 6 months ago, not sure if finished */ -/* FIXME does duplicates */ - void swap_chr(char*, char*); -void p(char *, size_t); +void p(char *, size_t, size_t); +void die_help(const char*); int main(int argc, char **argv) { if (argc != 2) - { - fprintf(stderr, "Usage: %s \n", argv[0]); - return EXIT_FAILURE; - } + die_help(argv[0]); - p(argv[1], 0); + p(argv[1], strlen(argv[1]), 0); return 0; } +void die_help(const char* argv0) { + fprintf(stderr, "Usage: %s \n", argv0); + exit(1); +} + void swap_chr(char *a, char *b) { char t = *a; *a = *b; *b = t; } -void p(char *string, size_t x) -{ - size_t i = 0; +void p(char *string, size_t x, size_t i) { + size_t j = 0; - if (x == strlen(string)) { + if (i == x) { puts(string); return; } - for (i = 0; i < strlen(string); i++) { - swap_chr(&string[x], &string[i]); - p(string, x + 1); - swap_chr(&string[x], &string[i]); + + for (j = i; j < x; j++) { + swap_chr(&string[i], &string[j]); + p(string, x, i+1); + swap_chr(&string[i], &string[j]); } } -- cgit v1.1