summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Phillips <david@sighup.nz>2017-09-14 20:45:22 +1200
committerDavid Phillips <david@sighup.nz>2017-09-14 20:51:12 +1200
commit5978cc86c5807a7fe36cba8a227c0001ecaa66d6 (patch)
treeee6366c5b4fc670d507d10be429cd66b3dd74112
parentcc1bcf89c4ee298c793c6b28e930b05c4b800bbe (diff)
downloadodds-and-ends-5978cc86c5807a7fe36cba8a227c0001ecaa66d6.tar.xz
Improve algorithm for permutations
-rw-r--r--words-misc/permutations.c34
1 files 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 <stdlib.h>
#include <string.h>
-/* 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 <word>\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 <word>\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]);
}
}