Account for disconnected paths in Loopy and Pearl error highlights.

In commits 24848706e and adc54741f, I revamped the highlighting of
erroneous connected components of those two puzzles' solution graphs
in cases where a non-solution loop existed, so that the largest
component was considered correct and the smaller ones lit up in red.

I intended this to work in the cases where you have most of a correct
solution as one component and a small spurious loop as another (in
which case the latter lights up red), or conversely where your mostly
correct component was joined into a loop leaving a few edges out (in
which case the left-out edges again light up red). However, a user
points out that I overlooked the case where your mostly correct
solution is not all one component! If you've got lots of separate
pieces of path, and one tiny loop that's definitely wrong, it's silly
to light up all but the longest piece of path as if they're erroneous.

Fixed by treating all the non-loop components as one unit for these
purposes. So if there is at least one loop and it isn't the only thing
on the board, then we _either_ light up all loops (if they're all
smaller than the set of non-loop paths put together), _or_ light up
everything but the largest loop (if that loop is the biggest thing on
the board).
This commit is contained in:
Simon Tatham
2016-04-28 20:42:23 +01:00
parent e917a7d03a
commit b31155b732
2 changed files with 44 additions and 26 deletions

26
pearl.c
View File

@ -1518,7 +1518,7 @@ static void check_completion(game_state *state, int mark)
int w = state->shared->w, h = state->shared->h, x, y, i, d;
int had_error = FALSE;
int *dsf, *component_state;
int nsilly, nloop, npath, largest_comp, largest_size;
int nsilly, nloop, npath, largest_comp, largest_size, total_pathsize;
enum { COMP_NONE, COMP_LOOP, COMP_PATH, COMP_SILLY, COMP_EMPTY };
if (mark) {
@ -1578,18 +1578,18 @@ static void check_completion(game_state *state, int mark)
/* Count the components, and find the largest sensible one. */
nsilly = nloop = npath = 0;
total_pathsize = 0;
largest_comp = largest_size = -1;
for (i = 0; i < w*h; i++) {
if (component_state[i] == COMP_SILLY) {
nsilly++;
} else if (component_state[i] == COMP_PATH ||
component_state[i] == COMP_LOOP) {
} else if (component_state[i] == COMP_PATH) {
total_pathsize += dsf_size(dsf, i);
npath = 1;
} else if (component_state[i] == COMP_LOOP) {
int this_size;
if (component_state[i] == COMP_PATH)
npath++;
else if (component_state[i] == COMP_LOOP)
nloop++;
nloop++;
if ((this_size = dsf_size(dsf, i)) > largest_size) {
largest_comp = i;
@ -1597,6 +1597,10 @@ static void check_completion(game_state *state, int mark)
}
}
}
if (largest_size < total_pathsize) {
largest_comp = -1; /* means the paths */
largest_size = total_pathsize;
}
if (nloop > 0 && nloop + npath > 1) {
/*
@ -1606,8 +1610,12 @@ static void check_completion(game_state *state, int mark)
*/
for (i = 0; i < w*h; i++) {
int comp = dsf_canonify(dsf, i);
if ((component_state[comp] == COMP_LOOP ||
component_state[comp] == COMP_PATH) && comp != largest_comp)
if (component_state[comp] == COMP_PATH)
comp = -1; /* part of the 'all paths' quasi-component */
if ((component_state[comp] == COMP_PATH &&
-1 != largest_comp) ||
(component_state[comp] == COMP_LOOP &&
comp != largest_comp))
ERROR(i%w, i/w, state->lines[i]);
}
}