bool Permutation::next_permutation(int a, int b, int *p){ if (b>a) { return next_permutation(b, a, p); }else { bool v = false; int max = a<b?b:a; int min = a<b?a:b; int *i = p+(min-1); while (*i<max) { (*i)++; v=is_valid_permutation(a, b, p); if (v) { break; } } if (!v && *p!=max) { *i=0; next_permutation(a, b-1, p); if(!is_valid_permutation(a, b, p)) { next_permutation(a, b, p); } } return is_valid_permutation(a, b, p); } }
/* h / help flag " display this help and exit" v / version flag " output version information and exit" s / size int " size of hands, defaults to 8 (7, 8, 9, 10, J, Q, K, A" l / left flag " left run" r / right flag " right run" u / run string " mutti run" i / hi flag " ace hi" o / low flag " ace low (default)" */ char* handle_arguments(int argc, char** argv, struct arg_t* args) { init_default_args(args); Cmdline(args, argc, argv); if (args->v) { printf("mutti version %s\n", VERSION); } uint32 size1 =0; if (args->u == NULL) { error("Required parameter: -u/--run <run>"); } if (!(args->i ^ args->o)) { error("Excpecting -i/--hi or -o/--low to be set, not both."); } size1 = is_valid_permutation(args->u); if (!size1) { error("Given run (-u) is not a comma delimted permutation."); } if (args->s != 8) { error("Invalid size: expected 8!"); } if (args->s != size1) { error("Given permutation size and specified permutation are not the same size."); } return argv[args->optind]; }