+static unsigned char *get_correct(game_state *state)
+{
+ unsigned char *ret;
+ int x, y;
+
+ ret = snewn(state->w * state->h, unsigned char);
+ memset(ret, 0xFF, state->w * state->h);
+
+ for (x = 0; x < state->w; x++)
+ for (y = 0; y < state->h; y++)
+ if (index(state,ret,x,y) == 0xFF) {
+ int rw, rh;
+ int xx, yy;
+ int num, area, valid;
+
+ /*
+ * Find a rectangle starting at this point.
+ */
+ rw = 1;
+ while (x+rw < state->w && !vedge(state,x+rw,y))
+ rw++;
+ rh = 1;
+ while (y+rh < state->h && !hedge(state,x,y+rh))
+ rh++;
+
+ /*
+ * We know what the dimensions of the rectangle
+ * should be if it's there at all. Find out if we
+ * really have a valid rectangle.
+ */
+ valid = TRUE;
+ /* Check the horizontal edges. */
+ for (xx = x; xx < x+rw; xx++) {
+ for (yy = y; yy <= y+rh; yy++) {
+ int e = !HRANGE(state,xx,yy) || hedge(state,xx,yy);
+ int ec = (yy == y || yy == y+rh);
+ if (e != ec)
+ valid = FALSE;
+ }
+ }
+ /* Check the vertical edges. */
+ for (yy = y; yy < y+rh; yy++) {
+ for (xx = x; xx <= x+rw; xx++) {
+ int e = !VRANGE(state,xx,yy) || vedge(state,xx,yy);
+ int ec = (xx == x || xx == x+rw);
+ if (e != ec)
+ valid = FALSE;
+ }
+ }
+
+ /*
+ * If this is not a valid rectangle with no other
+ * edges inside it, we just mark this square as not
+ * complete and proceed to the next square.
+ */
+ if (!valid) {
+ index(state, ret, x, y) = 0;
+ continue;
+ }
+
+ /*
+ * We have a rectangle. Now see what its area is,
+ * and how many numbers are in it.
+ */
+ num = 0;
+ area = 0;
+ for (xx = x; xx < x+rw; xx++) {
+ for (yy = y; yy < y+rh; yy++) {
+ area++;
+ if (grid(state,xx,yy)) {
+ if (num > 0)
+ valid = FALSE; /* two numbers */
+ num = grid(state,xx,yy);
+ }
+ }
+ }
+ if (num != area)
+ valid = FALSE;
+
+ /*
+ * Now fill in the whole rectangle based on the
+ * value of `valid'.
+ */
+ for (xx = x; xx < x+rw; xx++) {
+ for (yy = y; yy < y+rh; yy++) {
+ index(state, ret, xx, yy) = valid;
+ }
+ }
+ }
+
+ return ret;
+}
+
+static game_state *new_game(midend *me, game_params *params, char *desc)