Error highlighting bug in Bridges: when counting the number of extra

bridges that could go to an island, the game was not correctly
accounting for existing bridges in all circumstances.

(E.g. in 7x7m2:2a6a2a1g4a6c4i1a1h23c2b, connect the top right 1 to
the 2 left of it, and the 6 left of that correctly lights up red.
But now connect the 6 to the 6 below it, and it wrongly unlights
again.)

[originally from svn r8905]
This commit is contained in:
Simon Tatham
2010-03-21 08:48:29 +00:00
parent d437253eca
commit 5627dc4049

View File

@ -542,9 +542,24 @@ static int island_impossible(struct island *is, int strict)
assert(is_orth); assert(is_orth);
ifree = is_orth->count - island_countbridges(is_orth); ifree = is_orth->count - island_countbridges(is_orth);
if (ifree > 0) if (ifree > 0) {
nsurrspc += min(ifree, MAXIMUM(is->state, dx, /*
is->adj.points[i].x, is->adj.points[i].y)); * ifree is the number of bridges unfilled in the other
* island, which is clearly an upper bound on the number
* of extra bridges this island may run to it.
*
* Another upper bound is the number of bridges unfilled
* on the specific line between here and there. We must
* take the minimum of both.
*/
int bmax = MAXIMUM(is->state, dx,
is->adj.points[i].x, is->adj.points[i].y);
int bcurr = GRIDCOUNT(is->state,
is->adj.points[i].x, is->adj.points[i].y,
dx ? G_LINEH : G_LINEV);
assert(bcurr <= bmax);
nsurrspc += min(ifree, bmax - bcurr);
}
} }
if (nsurrspc < nspc) { if (nsurrspc < nspc) {
debug(("island at (%d,%d) impossible: surr. islands %d spc, need %d.\n", debug(("island at (%d,%d) impossible: surr. islands %d spc, need %d.\n",