diff --git a/meson.build b/meson.build index 174b9ec..82cfda3 100644 --- a/meson.build +++ b/meson.build @@ -9,6 +9,7 @@ project( ) sources = [ + 'src/backtracking.c', 'src/constraints.c', 'src/main.c', 'src/solver/last_remaining.c', diff --git a/src/backtracking.c b/src/backtracking.c new file mode 100644 index 0000000..cc1ae2d --- /dev/null +++ b/src/backtracking.c @@ -0,0 +1,36 @@ +#include "backtracking.h" + +#include + +#include "constraints.h" +#include "sudoku.h" + +static bool try_at(struct sudoku *grid, size_t i, size_t j, int n) { + grid->grid[i][j] = n; + return !(line_violation(grid, i, j) || column_violation(grid, i, j) + || square_violation(grid, i, j)); +} + +bool solve_backtracking(struct sudoku *grid) { + if (!grid) + return false; + + for (size_t i = 0; i < 9; ++i) { + for (size_t j = 0; j < 9; ++j) { + if (grid->grid[i][j] != 0) + continue; + + for (int n = 1; n <= 9; ++n) { + if (!try_at(grid, i, j, n)) + continue; + if (solve_backtracking(grid)) + return true; + } + + grid->grid[i][j] = 0; + return false; + } + } + + return true; +} diff --git a/src/backtracking.h b/src/backtracking.h new file mode 100644 index 0000000..2384839 --- /dev/null +++ b/src/backtracking.h @@ -0,0 +1,10 @@ +#ifndef BACKTRACKING_H +#define BACKTRACKING_H + +#include + +struct sudoku; + +bool solve_backtracking(struct sudoku *grid); + +#endif /* !BACKTRACKING_H */