From 36be2b2eb22ba9319a1ae478b612ac91e9e367d1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 21 Dec 2020 20:40:05 +0100 Subject: [PATCH] sudoku: constraints: add sudoku rules constraints --- meson.build | 1 + src/constraints.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++ src/constraints.h | 13 ++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 src/constraints.c create mode 100644 src/constraints.h diff --git a/meson.build b/meson.build index dd667dc..ef8e833 100644 --- a/meson.build +++ b/meson.build @@ -9,6 +9,7 @@ project( ) sources = [ + 'src/constraints.c', 'src/main.c', 'src/sudoku.c', ] diff --git a/src/constraints.c b/src/constraints.c new file mode 100644 index 0000000..c2edcc2 --- /dev/null +++ b/src/constraints.c @@ -0,0 +1,50 @@ +#include "constraints.h" + +#include "sudoku.h" + +bool line_violation(const struct sudoku *grid, size_t i, size_t j) { + if (!grid) + return true; + + for (size_t l = 0; l < 9; ++l) { + if (l == i) + continue; + if (grid->grid[l][j] == grid->grid[i][j]) + return true; + } + + return false; +} + +bool column_violation(const struct sudoku *grid, size_t i, size_t j) { + if (!grid) + return true; + + for (size_t c = 0; c < 9; ++c) { + if (c == j) + continue; + if (grid->grid[i][c] == grid->grid[i][j]) + return true; + } + + return false; +} + +bool square_violation(const struct sudoku *grid, size_t i, size_t j) { + if (!grid) + return true; + + const size_t x = i / 3; + const size_t y = j / 3; + + for (size_t l = 3 * x; l < 3 * (x + 1); ++l) { + for (size_t c = 3 * y; c < 3 * (y + 1); ++c) { + if (l == i && c == j) + continue; + if (grid->grid[l][c] == grid->grid[i][j]) + return true; + } + } + + return false; +} diff --git a/src/constraints.h b/src/constraints.h new file mode 100644 index 0000000..09e73a0 --- /dev/null +++ b/src/constraints.h @@ -0,0 +1,13 @@ +#ifndef CONSTRAINTS_H +#define CONSTRAINTS_H + +#include +#include + +struct sudoku; + +bool line_violation(const struct sudoku *grid, size_t i, size_t j); +bool column_violation(const struct sudoku *grid, size_t i, size_t j); +bool square_violation(const struct sudoku *grid, size_t i, size_t j); + +#endif /* !CONSTRAINTS_H */