mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Galaxies: fix recursion depth limit in solver.
The static variable 'solver_recurse_depth' is _mostly_ used by the standalone solver, to appropriately indent the solver diagnostics for the current recursion level. So most uses of it are guarded by an '#ifdef STANDALONE_SOLVER' statement, or some equivalent (such as being inside the solvep() macro). One exception is the check that limits the recursion depth to 5, to avoid getting hung up forever on a too-hard game. Unfortunately, this check depends on the variable actually incrementing when we recurse another level - and it wasn't, because the increment itself was under ifdef! So the generator in live Galaxies could recurse arbitrarily deep, and generate puzzles that the standalone solver found too hard _even_ at Unreasonable mode. Removed the ifdefs, so that solver_recurse_depth is now incremented and decremented. Also, make sure to initialise the depth to 0 at the start of a solver run, just in case it had a bogus value left over from a previous run.
This commit is contained in:
15
galaxies.c
15
galaxies.c
@ -187,6 +187,7 @@ struct game_state {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static bool check_complete(const game_state *state, int *dsf, int *colours);
|
static bool check_complete(const game_state *state, int *dsf, int *colours);
|
||||||
|
static int solver_state_inner(game_state *state, int maxdiff);
|
||||||
static int solver_state(game_state *state, int maxdiff);
|
static int solver_state(game_state *state, int maxdiff);
|
||||||
static int solver_obvious(game_state *state);
|
static int solver_obvious(game_state *state);
|
||||||
static int solver_obvious_dot(game_state *state, space *dot);
|
static int solver_obvious_dot(game_state *state, space *dot);
|
||||||
@ -2415,9 +2416,7 @@ static int solver_recurse(game_state *state, int maxdiff)
|
|||||||
solver_recurse_depth*4, "",
|
solver_recurse_depth*4, "",
|
||||||
rctx.best->x, rctx.best->y, rctx.bestn));
|
rctx.best->x, rctx.best->y, rctx.bestn));
|
||||||
|
|
||||||
#ifdef STANDALONE_SOLVER
|
|
||||||
solver_recurse_depth++;
|
solver_recurse_depth++;
|
||||||
#endif
|
|
||||||
|
|
||||||
ingrid = snewn(gsz, space);
|
ingrid = snewn(gsz, space);
|
||||||
memcpy(ingrid, state->grid, gsz * sizeof(space));
|
memcpy(ingrid, state->grid, gsz * sizeof(space));
|
||||||
@ -2432,7 +2431,7 @@ static int solver_recurse(game_state *state, int maxdiff)
|
|||||||
state->dots[n]->x, state->dots[n]->y,
|
state->dots[n]->x, state->dots[n]->y,
|
||||||
"Attempting for recursion");
|
"Attempting for recursion");
|
||||||
|
|
||||||
ret = solver_state(state, maxdiff);
|
ret = solver_state_inner(state, maxdiff);
|
||||||
|
|
||||||
if (diff == DIFF_IMPOSSIBLE && ret != DIFF_IMPOSSIBLE) {
|
if (diff == DIFF_IMPOSSIBLE && ret != DIFF_IMPOSSIBLE) {
|
||||||
/* we found our first solved grid; copy it away. */
|
/* we found our first solved grid; copy it away. */
|
||||||
@ -2464,9 +2463,7 @@ static int solver_recurse(game_state *state, int maxdiff)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef STANDALONE_SOLVER
|
|
||||||
solver_recurse_depth--;
|
solver_recurse_depth--;
|
||||||
#endif
|
|
||||||
|
|
||||||
if (outgrid) {
|
if (outgrid) {
|
||||||
/* we found (at least one) soln; copy it back to state */
|
/* we found (at least one) soln; copy it back to state */
|
||||||
@ -2477,7 +2474,7 @@ static int solver_recurse(game_state *state, int maxdiff)
|
|||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int solver_state(game_state *state, int maxdiff)
|
static int solver_state_inner(game_state *state, int maxdiff)
|
||||||
{
|
{
|
||||||
solver_ctx *sctx = new_solver(state);
|
solver_ctx *sctx = new_solver(state);
|
||||||
int ret, diff = DIFF_NORMAL;
|
int ret, diff = DIFF_NORMAL;
|
||||||
@ -2544,6 +2541,12 @@ got_result:
|
|||||||
return diff;
|
return diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int solver_state(game_state *state, int maxdiff)
|
||||||
|
{
|
||||||
|
solver_recurse_depth = 0;
|
||||||
|
return solver_state_inner(state, maxdiff);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef EDITOR
|
#ifndef EDITOR
|
||||||
static char *solve_game(const game_state *state, const game_state *currstate,
|
static char *solve_game(const game_state *state, const game_state *currstate,
|
||||||
const char *aux, const char **error)
|
const char *aux, const char **error)
|
||||||
|
Reference in New Issue
Block a user