aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2010-03-21 08:48:29 +0000
committerSimon Tatham <anakin@pobox.com>2010-03-21 08:48:29 +0000
commit5627dc4049915e3b05f74ac87e36503f6f3fc62d (patch)
treee887d9a3bb1a5c75afb29f2bfdead3a08153c055
parentd437253eca0341b5bcf6b459483ecd2cc6066164 (diff)
downloadpuzzles-5627dc4049915e3b05f74ac87e36503f6f3fc62d.zip
puzzles-5627dc4049915e3b05f74ac87e36503f6f3fc62d.tar.gz
puzzles-5627dc4049915e3b05f74ac87e36503f6f3fc62d.tar.bz2
puzzles-5627dc4049915e3b05f74ac87e36503f6f3fc62d.tar.xz
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]
-rw-r--r--bridges.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/bridges.c b/bridges.c
index 5bb73f4..4219df4 100644
--- a/bridges.c
+++ b/bridges.c
@@ -542,9 +542,24 @@ static int island_impossible(struct island *is, int strict)
assert(is_orth);
ifree = is_orth->count - island_countbridges(is_orth);
- if (ifree > 0)
- nsurrspc += min(ifree, MAXIMUM(is->state, dx,
- is->adj.points[i].x, is->adj.points[i].y));
+ if (ifree > 0) {
+ /*
+ * 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) {
debug(("island at (%d,%d) impossible: surr. islands %d spc, need %d.\n",