ref: 20606f0fea14fecae55efa7fef4314a2f999ddc3
parent: ce203c12efe0e10445a3be56c4308db42d9086c8
author: Simon Tatham <anakin@pobox.com>
date: Fri Apr 21 05:26:14 EDT 2023
Filling: switch to using dsf_minimal in minimize_clue_set. Turns out that was another case where we were assuming the canonical dsf element was also the minimal one, because we process the clues in order and expect to start a linked list at the canonical element of each region and then add the rest of the cells to the existing one. Easily fixed by using the minimal element again.
--- a/filling.c
+++ b/filling.c
@@ -1135,7 +1135,7 @@
int i;
if (!dsf)
- dsf = dsf_new(w * h);
+ dsf = dsf_new_min(w * h);
else
dsf_reinit(dsf);
@@ -1174,7 +1174,7 @@
dsf = make_dsf(NULL, board, w, h);
next = snewn(sz, int);
for (i = 0; i < sz; ++i) {
- int j = dsf_canonify(dsf, i);
+ int j = dsf_minimal(dsf, i);
if (i == j) {
/* First cell of a region; set next[i] = -1 to indicate
* end-of-list. */
@@ -1181,7 +1181,7 @@
next[i] = -1;
} else {
/* Add this cell to a region which already has a
- * linked-list head, by pointing the canonical element j
+ * linked-list head, by pointing the minimal element j
* at this one, and pointing this one in turn at wherever
* j previously pointed. (This should end up with the
* elements linked in the order 1,n,n-1,n-2,...,2, which
@@ -1209,7 +1209,7 @@
* if we can.
*/
for (i = 0; i < sz; ++i) {
- int j = dsf_canonify(dsf, shuf[i]);
+ int j = dsf_minimal(dsf, shuf[i]);
if (next[j] != -2) {
int tmp = board[j];
int k;