diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-08-02 23:16:46 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-08-02 23:16:46 +0000 |
| commit | afe80030e4935fdebfbed24eeae94274cb7f0632 (patch) | |
| tree | f163f05a40523832c696f7d0c69c0493059dae95 /dsf.c | |
| parent | 207c847553a978c6fcdb6269dc2b0add3c99a109 (diff) | |
| download | puzzles-afe80030e4935fdebfbed24eeae94274cb7f0632.zip puzzles-afe80030e4935fdebfbed24eeae94274cb7f0632.tar.gz puzzles-afe80030e4935fdebfbed24eeae94274cb7f0632.tar.bz2 puzzles-afe80030e4935fdebfbed24eeae94274cb7f0632.tar.xz | |
New puzzle: `Slant', picked from the Japanese-language section of
nikoli.co.jp (which has quite a few puzzles that they don't seem to
have bothered to translate into English).
Minor structural change: the disjoint set forest code used in the
Net solver has come in handy again, so I've moved it out into its
own module dsf.c.
[originally from svn r6155]
Diffstat (limited to 'dsf.c')
| -rw-r--r-- | dsf.c | 28 |
1 files changed, 28 insertions, 0 deletions
@@ -0,0 +1,28 @@ +/* + * dsf.c: two small functions to handle a disjoint set forest, + * which is a data structure useful in any solver which has to + * worry about avoiding closed loops. + */ + +int dsf_canonify(int *dsf, int val) +{ + int v2 = val; + + while (dsf[val] != val) + val = dsf[val]; + + while (v2 != val) { + int tmp = dsf[v2]; + dsf[v2] = val; + v2 = tmp; + } + + return val; +} + +void dsf_merge(int *dsf, int v1, int v2) +{ + v1 = dsf_canonify(dsf, v1); + v2 = dsf_canonify(dsf, v2); + dsf[v2] = v1; +} |