From ce4d6f93c8d00a56b9356d0c0d8489c28e1459df Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 25 Dec 2021 20:57:45 +0100 Subject: Added -O option for solve (specify number of moves within optimal) --- src/commands.c | 22 +++++++++++++++++----- src/cubetypes.h | 2 +- src/solve.c | 9 ++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/commands.c b/src/commands.c index 7d30c88..56ff944 100644 --- a/src/commands.c +++ b/src/commands.c @@ -147,7 +147,7 @@ solve_parse_args(int c, char **v) a->opts->max_moves = 20; a->opts->max_solutions = 1; a->opts->nthreads = 1; - a->opts->optimal_only = false; + a->opts->optimal = -1; a->opts->can_niss = false; a->opts->verbose = false; a->opts->all = false; @@ -163,7 +163,7 @@ solve_parse_args(int c, char **v) if (val < 0 || val > 100) { fprintf(stderr, "Invalid min number of moves" - "(0 <= m <= 100).\n"); + "(0 <= N <= 100).\n"); return a; } a->opts->min_moves = val; @@ -172,7 +172,7 @@ solve_parse_args(int c, char **v) if (val < 0 || val > 100) { fprintf(stderr, "Invalid max number of moves" - "(0 <= M <= 100).\n"); + "(0 <= N <= 100).\n"); return a; } a->opts->max_moves = val; @@ -196,7 +196,18 @@ solve_parse_args(int c, char **v) a->opts->max_solutions = val; fixedmsols = true; } else if (!strcmp(v[i], "-o")) { - a->opts->optimal_only = true; + a->opts->optimal = 0; + infinitesols = true; + } else if (!strcmp(v[i], "-O") && i+1 < c) { + val = strtol(v[++i], NULL, 10); + if (val < 0 || val > 100 || + (val == 0 && strcmp("0", v[i]))) { + fprintf(stderr, + "Invalid max number of moves" + " (0 <= N <= 100).\n"); + return a; + } + a->opts->optimal = val; infinitesols = true; } else if (!strcmp(v[i], "-N")) { a->opts->can_niss = true; @@ -447,7 +458,8 @@ read_scramble(int c, char **v, CommandArgs *args) for(i = 0; i < c; i++) { aux = new_alg(v[i]); if (aux->len == 0) { - fprintf(stderr, "Error: %s unrecognized\n", v[i]); + fprintf(stderr, "Error: %s or its argument" + "unrecognized\n", v[i]); free(aux); return false; } diff --git a/src/cubetypes.h b/src/cubetypes.h index 6d8af21..1b679aa 100644 --- a/src/cubetypes.h +++ b/src/cubetypes.h @@ -279,7 +279,7 @@ solveoptions int max_moves; int max_solutions; int nthreads; - bool optimal_only; + int optimal; bool can_niss; bool verbose; bool all; diff --git a/src/solve.c b/src/solve.c index 931dc02..79e421d 100644 --- a/src/solve.c +++ b/src/solve.c @@ -373,7 +373,7 @@ niss_makes_sense(DfsArg *arg) AlgList * solve(Cube cube, Step *step, SolveOptions *opts) { - int d; + int d, op; AlgList *sols; Cube c; @@ -396,16 +396,19 @@ solve(Cube cube, Step *step, SolveOptions *opts) return sols; } + op = -1; for (d = opts->min_moves; d <= opts->max_moves && - !(sols->len && opts->optimal_only) && - sols->len < opts->max_solutions; + !(opts->optimal != -1 && op != -1 && opts->optimal + op < d) && + sols->len < opts->max_solutions; d++) { if (opts->verbose) fprintf(stderr, "Found %d solutions, searching depth %d...\n", sols->len, d); multidfs(c, step, opts, sols, d); + if (sols->len > 0 && op == -1) + op = d; } return sols; -- cgit v1.3