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",
if (sscanf(move, "%d,%d,%d,%d,%d%n",
&x1, &y1, &x2, &y2, &nl, &n) != 5)
goto badmove;
+ if (!INGRID(ret, x1, y1) || !INGRID(ret, x2, y2))
+ goto badmove;
is1 = INDEX(ret, gridi, x1, y1);
is2 = INDEX(ret, gridi, x2, y2);
if (!is1 || !is2) goto badmove;
if (sscanf(move, "%d,%d,%d,%d%n",
&x1, &y1, &x2, &y2, &n) != 4)
goto badmove;
+ if (!INGRID(ret, x1, y1) || !INGRID(ret, x2, y2))
+ goto badmove;
is1 = INDEX(ret, gridi, x1, y1);
is2 = INDEX(ret, gridi, x2, y2);
if (!is1 || !is2) goto badmove;
if (sscanf(move, "%d,%d%n",
&x1, &y1, &n) != 2)
goto badmove;
+ if (!INGRID(ret, x1, y1))
+ goto badmove;
is1 = INDEX(ret, gridi, x1, y1);
if (!is1) goto badmove;
island_togglemark(is1);
#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,
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),
/* 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;