X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/b3d64b2b83cc59c9f01e65908072d606a1515bc8..8c4ea6f0ea2024075e110bef9a6ad3037cbf9b1d:/slant.c diff --git a/slant.c b/slant.c index fd7adad..fc47209 100644 --- a/slant.c +++ b/slant.c @@ -287,7 +287,10 @@ struct solver_scratch { * below it might form a <-shape between them * * Any starting 1 or 3 clue rules out four bits in this array - * immediately; we can rule out further bits during play using + * immediately; a 2 clue propagates any ruled-out bit past it + * (if the two squares on one side of a 2 cannot be a v-shape, + * then neither can the two on the other side be the same + * v-shape); we can rule out further bits during play using * partially filled 2 clues; whenever a pair of squares is * known not to be _either_ kind of v-shape, we can mark them * as equivalent. @@ -465,15 +468,13 @@ static int slant_solve(int w, int h, const signed char *clues, * Establish a disjoint set forest for tracking connectedness * between grid points. */ - for (i = 0; i < W*H; i++) - sc->connected[i] = i; /* initially all distinct */ + dsf_init(sc->connected, W*H); /* * Establish a disjoint set forest for tracking which squares * are known to slant in the same direction. */ - for (i = 0; i < w*h; i++) - sc->equiv[i] = i; /* initially all distinct */ + dsf_init(sc->equiv, w*h); /* * Clear the slashval array. @@ -486,7 +487,7 @@ static int slant_solve(int w, int h, const signed char *clues, memset(sc->vbitmap, 0xF, w*h); /* - * Initialise the `exits' and `border' arrays. Theses is used + * Initialise the `exits' and `border' arrays. These are used * to do second-order loop avoidance: the dual of the no loops * constraint is that every point must be somehow connected to * the border of the grid (otherwise there would be a solid @@ -1003,9 +1004,7 @@ static void slant_generate(int w, int h, signed char *soln, random_state *rs) * Establish a disjoint set forest for tracking connectedness * between grid points. */ - connected = snewn(W*H, int); - for (i = 0; i < W*H; i++) - connected[i] = i; /* initially all distinct */ + connected = snew_dsf(W*H); /* * Prepare a list of the squares in the grid, and fill them in @@ -1386,8 +1385,7 @@ static int check_completion(game_state *state) * edge is visited at most twice. */ dsf = state->clues->tmpdsf; - for (i = 0; i < W*H; i++) - dsf[i] = i; /* initially all distinct */ + dsf_init(dsf, W*H); for (y = 0; y < h; y++) for (x = 0; x < w; x++) { int i1, i2; @@ -2188,7 +2186,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize) #endif const struct game thegame = { - "Slant", "games.slant", + "Slant", "games.slant", "slant", default_params, game_fetch_preset, decode_params,