Bridges solver fix: in map_update_possibles, collect values from

maxh/maxv for squares between islands as well as on islands.

[originally from svn r9542]
This commit is contained in:
Simon Tatham
2012-05-31 18:10:10 +00:00
parent 12cd1ee235
commit 00f74d4c7d

View File

@ -881,17 +881,20 @@ static void map_update_possibles(game_state *state)
/* Unset possible flags until we find an island. */ /* Unset possible flags until we find an island. */
for (y = 0; y < state->h; y++) { for (y = 0; y < state->h; y++) {
is_s = IDX(state, gridi, idx); is_s = IDX(state, gridi, idx);
if (is_s) break; if (is_s) {
maxb = is_s->count;
break;
}
IDX(state, possv, idx) = 0; IDX(state, possv, idx) = 0;
idx += w; idx += w;
} }
for (; y < state->h; y++) { for (; y < state->h; y++) {
maxb = min(maxb, IDX(state, maxv, idx));
is_f = IDX(state, gridi, idx); is_f = IDX(state, gridi, idx);
if (is_f) { if (is_f) {
assert(is_s); assert(is_s);
maxb = IDX(state, maxv, idx); np = min(maxb, is_f->count);
np = min(maxb, min(is_s->count, is_f->count));
if (s != -1) { if (s != -1) {
for (i = s; i <= e; i++) { for (i = s; i <= e; i++) {
@ -901,6 +904,7 @@ static void map_update_possibles(game_state *state)
s = y+1; s = y+1;
bl = 0; bl = 0;
is_s = is_f; is_s = is_f;
maxb = is_s->count;
} else { } else {
e = y; e = y;
if (IDX(state,grid,idx) & (G_LINEH|G_NOLINEV)) bl = 1; if (IDX(state,grid,idx) & (G_LINEH|G_NOLINEV)) bl = 1;
@ -921,17 +925,20 @@ static void map_update_possibles(game_state *state)
bl = 0; bl = 0;
for (x = 0; x < state->w; x++) { for (x = 0; x < state->w; x++) {
is_s = IDX(state, gridi, idx); is_s = IDX(state, gridi, idx);
if (is_s) break; if (is_s) {
maxb = is_s->count;
break;
}
IDX(state, possh, idx) = 0; IDX(state, possh, idx) = 0;
idx += 1; idx += 1;
} }
for (; x < state->w; x++) { for (; x < state->w; x++) {
maxb = min(maxb, IDX(state, maxh, idx));
is_f = IDX(state, gridi, idx); is_f = IDX(state, gridi, idx);
if (is_f) { if (is_f) {
assert(is_s); assert(is_s);
maxb = IDX(state, maxh, idx); np = min(maxb, is_f->count);
np = min(maxb, min(is_s->count, is_f->count));
if (s != -1) { if (s != -1) {
for (i = s; i <= e; i++) { for (i = s; i <= e; i++) {
@ -941,6 +948,7 @@ static void map_update_possibles(game_state *state)
s = x+1; s = x+1;
bl = 0; bl = 0;
is_s = is_f; is_s = is_f;
maxb = is_s->count;
} else { } else {
e = x; e = x;
if (IDX(state,grid,idx) & (G_LINEV|G_NOLINEH)) bl = 1; if (IDX(state,grid,idx) & (G_LINEV|G_NOLINEH)) bl = 1;