-
Notifications
You must be signed in to change notification settings - Fork 0
/
SudokuSolver.h
64 lines (43 loc) · 3.47 KB
/
SudokuSolver.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#pragma once
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <array>
class SudokuSolver {
public:
static bool isValidSudoku(const std::vector<std::vector<char>>& board);
static bool isValidNonomino(const std::vector<std::vector<char>>& board,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch);
static void solveSudoku(std::vector<std::vector<char>>& board);
static void solveNonomino(std::vector<std::vector<char>>& board,
const std::vector<std::vector<unsigned char>>& typeGrid);
static void safeSolve(std::vector<std::vector<char>>& board);
private:
static bool noDuplicate(const std::vector<std::vector<char>>& board);
static bool noDuplicateNono(const std::vector<std::vector<char>>& board,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch);
static bool noDupliRow(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col, char value);
static bool noDupliRow(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col, char value, unsigned char begin, unsigned char end);
static bool noDupliCol(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col, char value);
static bool noDupliCol(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col, char value, unsigned char begin, unsigned char end);
static bool noDupliMat(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col, char value);
static bool noDupliType(const std::vector<std::vector<char>>& board, unsigned char cur_row, unsigned char cur_col,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch,
char value);
static bool canPlace(const std::vector<std::vector<char>>& board);
static bool canPlaceNono(const std::vector<std::vector<char>>& board,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch);
static bool isValid(const std::vector<std::vector<char>>& board, std::pair<unsigned char, unsigned char> pos, unsigned char num);
static bool isValidNono(const std::vector<std::vector<char>>& board, std::pair<unsigned char, unsigned char> pos,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch,
unsigned char num);
static bool solve(std::vector<std::vector<char>>& board, std::unordered_map<unsigned char, std::array<bool, 9>>& solver);
static bool solveNono(std::vector<std::vector<char>>& board, std::unordered_map<unsigned char, std::array<bool, 9>>& solver,
const std::vector<std::vector<unsigned char>>& typeGrid,
const std::vector<std::vector<std::pair<unsigned char, unsigned char>>>& typeSearch);
};