Sudoku Solver 1.0
Загрузка...
Поиск...
Не найдено
test_sudoku_utils.h
См. документацию.
1#include <algorithm>
2#include <array>
3#include <set>
4
5template<size_t N>
6bool is_valid_sudoku(const std::array<std::array<int, N>, N>& board) {
7 // Проверка, что все цифры в диапазоне 1..N или 0 (пусто)
8 for (int r = 0; r < N; ++r) {
9 for (int c = 0; c < N; ++c) {
10 int val = board[r][c];
11 if (val != 0 && (val < 1 || val > N)) {
12 return false;
13 }
14 }
15 }
16
17 // Вспомогательная лямбда для проверки последовательности
18 auto has_duplicates = [](const std::vector<int>& nums) {
19 std::set<int> seen;
20 for (int x : nums) {
21 if (x != 0) {
22 if (seen.count(x)) return true;
23 seen.insert(x);
24 }
25 }
26 return false;
27 };
28
29 // Проверка строк
30 for (int r = 0; r < N; ++r) {
31 std::vector<int> row;
32 for (int c = 0; c < N; ++c) {
33 row.push_back(board[r][c]);
34 }
35 if (has_duplicates(row)) return false;
36 }
37
38 // Проверка столбцов
39 for (int c = 0; c < N; ++c) {
40 std::vector<int> col;
41 for (int r = 0; r < N; ++r) {
42 col.push_back(board[r][c]);
43 }
44 if (has_duplicates(col)) return false;
45 }
46
47 // Проверка блоков (для N = 9 или 16, где блок = sqrt(N) x sqrt(N))
48 constexpr size_t block_size = constexpr_sqrt(N);
49 for (int br = 0; br < N; br += block_size) {
50 for (int bc = 0; bc < N; bc += block_size) {
51 std::vector<int> block;
52 for (int r = br; r < br + block_size; ++r) {
53 for (int c = bc; c < bc + block_size; ++c) {
54 block.push_back(board[r][c]);
55 }
56 }
57 if (has_duplicates(block)) return false;
58 }
59 }
60
61 return true;
62}
constexpr size_t constexpr_sqrt(size_t n)
Вычисление целочисленного квадратного корня на этапе компиляции
Определения sudoku_solver.h:13
bool is_valid_sudoku(const std::array< std::array< int, N >, N > &board)
Определения test_sudoku_utils.h:6