diff options
Diffstat (limited to 'src/solve.c')
| -rw-r--r-- | src/solve.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/src/solve.c b/src/solve.c index 1f4a155..29f614b 100644 --- a/src/solve.c +++ b/src/solve.c | |||
| @@ -127,47 +127,36 @@ AlgList * | |||
| 127 | solve(Cube cube, Step *step, SolveOptions *opts) | 127 | solve(Cube cube, Step *step, SolveOptions *opts) |
| 128 | { | 128 | { |
| 129 | AlgListNode *node; | 129 | AlgListNode *node; |
| 130 | AlgList *sols = new_alglist(); | 130 | DfsData dd; |
| 131 | Cube c; | 131 | Cube c; |
| 132 | 132 | ||
| 133 | prepare_step(step, &dd); | ||
| 134 | |||
| 133 | if (step->detect != NULL) | 135 | if (step->detect != NULL) |
| 134 | step->pre_trans = step->detect(cube); | 136 | step->pre_trans = step->detect(cube); |
| 135 | c = apply_trans(step->pre_trans, cube); | 137 | c = apply_trans(step->pre_trans, cube); |
| 136 | 138 | ||
| 137 | DfsData dd = { | ||
| 138 | .m = 0, | ||
| 139 | .niss = false, | ||
| 140 | .lb = -1, | ||
| 141 | .last1 = NULLMOVE, | ||
| 142 | .last2 = NULLMOVE, | ||
| 143 | .sols = sols, | ||
| 144 | .current_alg = new_alg("") | ||
| 145 | }; | ||
| 146 | |||
| 147 | if (step->ready != NULL && !step->ready(c)) { | 139 | if (step->ready != NULL && !step->ready(c)) { |
| 148 | fprintf(stderr, "Cube not ready for solving step: "); | 140 | fprintf(stderr, "Cube not ready for solving step: "); |
| 149 | fprintf(stderr, "%s\n", step->ready_msg); | 141 | fprintf(stderr, "%s\n", step->ready_msg); |
| 150 | return sols; | 142 | return dd.sols; |
| 151 | } | 143 | } |
| 152 | 144 | ||
| 153 | moveset_to_list(step->moveset, dd.sorted_moves); | ||
| 154 | movelist_to_position(dd.sorted_moves, dd.move_position); | ||
| 155 | |||
| 156 | for (dd.d = opts->min_moves; | 145 | for (dd.d = opts->min_moves; |
| 157 | dd.d <= opts->max_moves && | 146 | dd.d <= opts->max_moves && |
| 158 | !(sols->len && opts->optimal_only) && | 147 | !(dd.sols->len && opts->optimal_only) && |
| 159 | sols->len < opts->max_solutions; | 148 | dd.sols->len < opts->max_solutions; |
| 160 | dd.d++) { | 149 | dd.d++) { |
| 161 | if (opts->verbose) | 150 | if (opts->verbose) |
| 162 | fprintf(stderr, | 151 | fprintf(stderr, |
| 163 | "Found %d solutions, searching depth %d...\n", | 152 | "Found %d solutions, searching depth %d...\n", |
| 164 | sols->len, dd.d); | 153 | dd.sols->len, dd.d); |
| 165 | dfs(c, step, opts, &dd); | 154 | dfs(c, step, opts, &dd); |
| 166 | } | 155 | } |
| 167 | 156 | ||
| 168 | for (node = sols->first; node != NULL; node = node->next) | 157 | for (node = dd.sols->first; node != NULL; node = node->next) |
| 169 | transform_alg(inverse_trans(step->pre_trans), node->alg); | 158 | transform_alg(inverse_trans(step->pre_trans), node->alg); |
| 170 | 159 | ||
| 171 | free_alg(dd.current_alg); | 160 | free_alg(dd.current_alg); |
| 172 | return sols; | 161 | return dd.sols; |
| 173 | } | 162 | } |
