* 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.
* 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.
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
* 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
* 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;
#endif
const struct game thegame = {
- "Slant", "games.slant",
+ "Slant", "games.slant", "slant",
default_params,
game_fetch_preset,
decode_params,