2023W-EFFPROG

Magic Hexagon.
Log | Files | Refs | README

commit beabb3edac99a1263e7cfa378546ce9f5081d32f
parent f8195a4318a5071e9d0c054114468539c60fce8d
Author: Markus Hunner <26381538+markhun@users.noreply.github.com>
Date:   Wed, 20 Dec 2023 11:55:59 +0100

Use bool as return type of solve(...)

Diffstat:
Mmagichex/src/magichex.c | 17+++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/magichex/src/magichex.c b/magichex/src/magichex.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include <assert.h> #include <string.h> +#include <stdbool.h> #define PLACEHOLDER_ENTRY_ID -1 // Placeholder entries are not actually part of the hexagon but used for padding. @@ -145,7 +146,7 @@ CHANGE_IDENTIFIER sum(HexagonEntry hexagon[], unsigned long nv, unsigned long st /* reduce the ranges of the variables as much as possible (with the constraints we use); returns 1 if all variables still have a non-empty range left, 0 if one has an empty range */ -int solve(unsigned long n, long d, HexagonEntry hexagon[]) +bool solve(unsigned long n, long d, HexagonEntry hexagon[]) { unsigned long r = 2*n-1; unsigned long H = 3*n*n-3*n+1; @@ -164,7 +165,7 @@ int solve(unsigned long n, long d, HexagonEntry hexagon[]) HexagonEntry *hexagonEntry = &hexagon[i]; if (hexagonEntry->lo == hexagonEntry->hi && occupation[hexagonEntry->lo-o] != i) { if (occupation[hexagonEntry->lo-o] < r*r) - return 0; /* another variable has the same value */ + return false; /* another variable has the same value */ occupation[hexagonEntry->lo-o] = i; /* occupy hexagonEntry->lo */ goto restart; } @@ -187,14 +188,14 @@ int solve(unsigned long n, long d, HexagonEntry hexagon[]) one (eliminate rotational symmetry) */ for (i=1; i<sizeof(corners)/sizeof(corners[0]); i++) { CHANGE_IDENTIFIER f = lessthan(&hexagon[corners[0]],&hexagon[corners[i]]); - if (f==NOSOLUTION) return 0; + if (f==NOSOLUTION) return false; if (f==CHANGED) goto restart; } /* eliminate the mirror symmetry between the corners to the right and left of the first corner */ { CHANGE_IDENTIFIER f = lessthan(&hexagon[corners[2]],&hexagon[corners[1]]); - if (f==NOSOLUTION) return 0; + if (f==NOSOLUTION) return false; if (f==CHANGED) goto restart; } /* sum constraints: each line and diagonal sums up to M */ @@ -203,18 +204,18 @@ int solve(unsigned long n, long d, HexagonEntry hexagon[]) CHANGE_IDENTIFIER f; /* line */ f = sum(hexagon+r*i+max(0,i+1-n), min(i+n,r+n-i-1), 1, M, hexagon, hexagon+r*r); - if (f==NOSOLUTION) return 0; + if (f==NOSOLUTION) return false; if (f==CHANGED) goto restart; /* column (diagonal down-left in the hexagon) */ f = sum(hexagon+i+max(0,i+1-n)*r, min(i+n,r+n-i-1), r, M, hexagon, hexagon+r*r); - if (f==NOSOLUTION) return 0; + if (f==NOSOLUTION) return false; if (f==CHANGED) goto restart; /* diagonal (down-right) */ f = sum(hexagon-n+1+i+max(0,n-i-1)*(r+1), min(i+n,r+n-i-1), r+1, M, hexagon, hexagon+r*r); - if (f==NOSOLUTION) return 0; + if (f==NOSOLUTION) return false; if (f==CHANGED) goto restart; } - return 1; + return true; // all done } void printhexagon(unsigned long n, HexagonEntry hexagon[])