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

12
solve.c
View File

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