diff options
| author | Simon Tatham <anakin@pobox.com> | 2021-03-29 20:49:17 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2021-03-29 21:00:13 +0100 |
| commit | 083de051cbc88f391c6bd28481b856013e293ce9 (patch) | |
| tree | c9c38b27f22e58b7583b3d0ad424d9ab6a10a3eb /filling.c | |
| parent | 1fcb61cffe538c11a11fc2ec94d6470a61df019e (diff) | |
| download | puzzles-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.c | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -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); |