X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/9a6d429a8372cc31fb1aa7de8e5f079a47ecf148..f04d88ba2c57c09a2e2598558ff1a42a7d86cfde:/bridges.c diff --git a/bridges.c b/bridges.c index 64501ef..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", @@ -2479,7 +2494,7 @@ static void dsf_debug_draw(drawing *dr, #ifdef DRAW_DSF int ts = TILE_SIZE/2; int ox = COORD(x) + ts/2, oy = COORD(y) + ts/2; - char str[10]; + char str[32]; sprintf(str, "%d", dsf_canonify(state->solver->dsf, DINDEX(x,y))); draw_text(dr, ox, oy, FONT_VARIABLE, ts, @@ -2556,7 +2571,7 @@ static void island_redraw(drawing *dr, int col = (v & G_ISSEL) ? COL_SELECTED : tcol; int bg = (v & G_CURSOR) ? COL_CURSOR : (v & G_MARK) ? COL_MARK : COL_BACKGROUND; - char str[10]; + char str[32]; #ifdef DRAW_GRID draw_rect_outline(dr, COORD(is->x), COORD(is->y), @@ -2759,7 +2774,7 @@ static void game_print(drawing *dr, game_state *state, int ts) /* Islands */ for (i = 0; i < state->n_islands; i++) { - char str[10]; + char str[32]; struct island *is = &state->islands[i]; grid = GRID(state, is->x, is->y); cx = COORD(is->x) + ts/2;