Clear pvals when setting cell

This removes the need to check if a cell is determined in solve()
This commit is contained in:
Camden Dixie O'Brien 2022-11-26 14:29:44 +00:00
parent 40c12c3458
commit ad8c0dc9c4
2 changed files with 7 additions and 12 deletions

18
solve.c
View File

@ -67,10 +67,8 @@ int solve(struct sudoku *sud)
* cell in its row.
*/
valmask = 0;
for (j = 0; j < NGROUP; ++j) {
if (!DET(sud->cells[rowidx_lut[i][j]]))
valmask |= sud->cells[rowidx_lut[i][j]];
}
for (j = 0; j < NGROUP; ++j)
valmask |= sud->cells[rowidx_lut[i][j]];
if ((pvals = sud->cells[i] & ~valmask)) {
setpval(sud, i, pvals);
match = true;
@ -82,10 +80,8 @@ int solve(struct sudoku *sud)
* cell in its column.
*/
valmask = 0;
for (j = 0; j < NGROUP; ++j) {
if (!DET(sud->cells[colidx_lut[i][j]]))
valmask |= sud->cells[colidx_lut[i][j]];
}
for (j = 0; j < NGROUP; ++j)
valmask |= sud->cells[colidx_lut[i][j]];
if ((pvals = sud->cells[i] & ~valmask)) {
setpval(sud, i, pvals);
match = true;
@ -97,10 +93,8 @@ int solve(struct sudoku *sud)
* cell in its segment.
*/
valmask = 0;
for (j = 0; j < NGROUP; ++j) {
if (!DET(sud->cells[segidx_lut[i][j]]))
valmask |= sud->cells[segidx_lut[i][j]];
}
for (j = 0; j < NGROUP; ++j)
valmask |= sud->cells[segidx_lut[i][j]];
if ((pvals = sud->cells[i] & ~valmask)) {
setpval(sud, i, pvals);
match = true;

1
sud.c
View File

@ -70,6 +70,7 @@ enum update_res update(struct sudoku *sud, unsigned i, unsigned val)
}
/* Set the cell's value. */
sud->cells[i] = 0;
sud->cells[i] |= DETMASK;
sud->cells[i] |= val << VALSHIFT;