aboutsummaryrefslogtreecommitdiff
path: root/filling.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2021-03-29 20:49:17 +0100
committerSimon Tatham <anakin@pobox.com>2021-03-29 21:00:13 +0100
commit083de051cbc88f391c6bd28481b856013e293ce9 (patch)
treec9c38b27f22e58b7583b3d0ad424d9ab6a10a3eb /filling.c
parent1fcb61cffe538c11a11fc2ec94d6470a61df019e (diff)
downloadpuzzles-083de051cbc88f391c6bd28481b856013e293ce9.zip
puzzles-083de051cbc88f391c6bd28481b856013e293ce9.tar.gz
puzzles-083de051cbc88f391c6bd28481b856013e293ce9.tar.bz2
puzzles-083de051cbc88f391c6bd28481b856013e293ce9.tar.xz
Filling: remove directional bias in grid generation.
The method of generating a solved Filling grid (before winnowing clues) is to loop over every square of the board, and for each one, if it has a neighbour which is part of a different region of the same size (i.e. the board is not currently legal), fix it by merging with one of its neighbours. We pick a neighbour to merge with based on the size of its region - but we always loop over the four possible neighbours in the same order, which introduces a directional bias into the breaking of ties in that comparison. Now we iterate over the four directions in random order.
Diffstat (limited to 'filling.c')
-rw-r--r--filling.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/filling.c b/filling.c
index a62161a..ffa3ab1 100644
--- a/filling.c
+++ b/filling.c
@@ -414,10 +414,15 @@ retry:
int merge = SENTINEL, min = maxsize - size + 1;
bool error = false;
int neighbour, neighbour_size, j;
+ int directions[4];
+
+ for (j = 0; j < 4; ++j)
+ directions[j] = j;
+ shuffle(directions, 4, sizeof(int), rs);
for (j = 0; j < 4; ++j) {
- const int x = (board[i] % w) + dx[j];
- const int y = (board[i] / w) + dy[j];
+ const int x = (board[i] % w) + dx[directions[j]];
+ const int y = (board[i] / w) + dy[directions[j]];
if (x < 0 || x >= w || y < 0 || y >= h) continue;
neighbour = dsf_canonify(dsf, w*y + x);