#define CMASK 0x60000000L
#define CUNIT 0x20000000L
+/*
+ * Maximum size of any clue block. Very large ones are annoying in UI
+ * terms (if they're multiplicative you end up with too many digits to
+ * fit in the square) and also in solver terms (too many possibilities
+ * to iterate over).
+ */
+#define MAXBLK 6
+
enum {
COL_BACKGROUND,
COL_GRID,
x = i % w;
y = i / w;
- if (x > 0 &&
+ if (x > 0 && dsf_size(dsf, i-1) < MAXBLK &&
(best == -1 || revorder[i-1] < revorder[best]))
best = i-1;
- if (x+1 < w &&
+ if (x+1 < w && dsf_size(dsf, i+1) < MAXBLK &&
(best == -1 || revorder[i+1] < revorder[best]))
best = i+1;
- if (y > 0 &&
+ if (y > 0 && dsf_size(dsf, i-w) < MAXBLK &&
(best == -1 || revorder[i-w] < revorder[best]))
best = i-w;
- if (y+1 < w &&
+ if (y+1 < w && dsf_size(dsf, i+w) < MAXBLK &&
(best == -1 || revorder[i+w] < revorder[best]))
best = i+w;
if (best >= 0) {
- singletons[i] = FALSE;
+ singletons[i] = singletons[best] = FALSE;
dsf_merge(dsf, i, best);
}
}
}
+ /* Quit and start again if we have any singletons left over
+ * which we weren't able to do anything at all with. */
+ for (i = 0; i < a; i++)
+ if (singletons[i])
+ break;
+ if (i < a)
+ continue;
+
/*
* Decide what would be acceptable clues for each block.
*