diff options
| author | Simon Tatham <anakin@pobox.com> | 2023-04-20 13:13:47 +0100 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2023-04-20 14:28:22 +0100 |
| commit | 16f997d34c7b435d3fcf5774c700579e188b017f (patch) | |
| tree | 952e854fdaf51a53996a7e39e821669633a486ac /divvy.c | |
| parent | 6c02b72d766fcb6a9598bdde80294a41e53cd02c (diff) | |
| download | puzzles-16f997d34c7b435d3fcf5774c700579e188b017f.zip puzzles-16f997d34c7b435d3fcf5774c700579e188b017f.tar.gz puzzles-16f997d34c7b435d3fcf5774c700579e188b017f.tar.bz2 puzzles-16f997d34c7b435d3fcf5774c700579e188b017f.tar.xz | |
Stop putting dsfs in existing scratch int arrays.
I'm going to work towards turning 'dsf' into an opaque type, so that I
can improve its implementation without breaking clients. The first
step is to deal manually with puzzles that currently reuse a single
array of ints for multiple purposes, some of which are dsf and some
are not.
In divvy_rectangle_attempt, 'tmp' was used as an int array and later a
dsf, and I've made a new 'tmpdsf' to be the latter.
In Dominosa, solver->pc_scratch2 was sometimes a dsf, and now there's
a new solver->dsf_scratch.
In Map, parse_edge_list() needed a dsf internally and then never
exported it; it expected to be passed an array of 2*w*h ints and used
the second half as a dsf. Now it expects only w*h ints, and allocates
its own dsf internally, freeing it again before returning.
And in Tents, find_errors() was allocating a single block of 2*w*h
ints and using the second half of it as a dsf, apparently just to save
one malloc. Now we malloc and free the dsf separately.
Diffstat (limited to 'divvy.c')
| -rw-r--r-- | divvy.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -262,7 +262,7 @@ static bool addremcommon(int w, int h, int x, int y, int *own, int val) */ int *divvy_rectangle_attempt(int w, int h, int k, random_state *rs) { - int *order, *queue, *tmp, *own, *sizes, *addable, *retdsf; + int *order, *queue, *tmp, *own, *sizes, *addable, *retdsf, *tmpdsf; bool *removable; int wh = w*h; int i, j, n, x, y, qhead, qtail; @@ -277,6 +277,7 @@ int *divvy_rectangle_attempt(int w, int h, int k, random_state *rs) queue = snewn(n, int); addable = snewn(wh*4, int); removable = snewn(wh, bool); + retdsf = tmpdsf = NULL; /* * Permute the grid squares into a random order, which will be @@ -619,18 +620,18 @@ int *divvy_rectangle_attempt(int w, int h, int k, random_state *rs) * the ominoes really are k-ominoes and we haven't * accidentally split one into two disconnected pieces. */ - dsf_init(tmp, wh); + tmpdsf = snew_dsf(wh); for (y = 0; y < h; y++) for (x = 0; x+1 < w; x++) if (own[y*w+x] == own[y*w+(x+1)]) - dsf_merge(tmp, y*w+x, y*w+(x+1)); + dsf_merge(tmpdsf, y*w+x, y*w+(x+1)); for (x = 0; x < w; x++) for (y = 0; y+1 < h; y++) if (own[y*w+x] == own[(y+1)*w+x]) - dsf_merge(tmp, y*w+x, (y+1)*w+x); + dsf_merge(tmpdsf, y*w+x, (y+1)*w+x); for (i = 0; i < wh; i++) { j = dsf_canonify(retdsf, i); - assert(dsf_canonify(tmp, j) == dsf_canonify(tmp, i)); + assert(dsf_canonify(tmpdsf, j) == dsf_canonify(tmpdsf, i)); } cleanup: @@ -640,6 +641,7 @@ int *divvy_rectangle_attempt(int w, int h, int k, random_state *rs) */ sfree(order); sfree(tmp); + sfree(tmpdsf); sfree(own); sfree(sizes); sfree(queue); |