diff --git a/src/main.c b/src/main.c index ec2f7df..ecc45a0 100644 --- a/src/main.c +++ b/src/main.c @@ -20,6 +20,8 @@ int main(int argc, char **argv) { 0x000, 0x000, 0x000, 0x000, 0x080, 0x000, 0x000, 0x040, 0x100, // clang-format on }; + sudoku_init(board); + sudoku_print(board); for (int i = 0; i < 2; i++) { sudoku_solve_step(board); diff --git a/src/sudoku.c b/src/sudoku.c index f64d6a1..31ed25e 100644 --- a/src/sudoku.c +++ b/src/sudoku.c @@ -8,6 +8,12 @@ #include "util/intdef.h" +void sudoku_init(u16 *board) { + for (uint i = 0; i < SUDOKU_LEN; i++) { + board[i] |= SUDOKU_ALL & -!board[i]; + } +} + /* removes `val` from `*brd`, if `*brd` is not equal to `val` */ static inline void setbrdpos(u16 *brd, u16 val) { *brd &= ~(val & -(*brd != val)); @@ -29,8 +35,6 @@ void sudoku_place(u16 *brd, u16 val, uint idx) { void sudoku_solve_step(u16 *board) { for (uint i = 0; i < SUDOKU_LEN; i++) { - board[i] |= SUDOKU_ALL & -!board[i]; - switch (board[i]) { case SUDOKU_1: case SUDOKU_2: diff --git a/src/sudoku.h b/src/sudoku.h index d49e62f..e33f172 100644 --- a/src/sudoku.h +++ b/src/sudoku.h @@ -22,6 +22,9 @@ enum sudoku_bitmask { SUDOKU_ALL = 0x01FF, }; +/* initialises the sudoku board to `SUDOKU_ALL`. (if the tile is empty) */ +void sudoku_init(u16 *board); + /* places `val` at `idx` in `board`, and removes `val` from the possibilities in neighbouring tiles */ void sudoku_place(u16 *board, u16 val, uint idx);