doaskuHuman-like solver for sudoku |
git clone git://git.dimitrijedobrota.com/doasku.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
ref.hpp (2841B)
0 #ifndef DOASKU_REF_HPP
1 #define DOASKU_REF_HPP
3 #include <array>
4 #include <cstdint>
5 #include <utility>
6 #include <vector>
8 class ref
9 {
10 public:
11 using change_t = std::tuple<uint8_t, uint16_t>;
12 using changes_t = std::vector<change_t>;
14 uint16_t get(uint8_t field) const { return m_value.at(field); }
15 uint16_t get_ref(uint8_t value) const { return m_ref.at(value); }
16 uint16_t get_value(uint8_t field) const { return m_res.at(field); }
18 void clear(uint8_t field, uint8_t value);
19 void set(uint8_t field, uint8_t value);
21 changes_t get_hidden_singles() const;
22 changes_t get_naked_singles() const;
24 auto get_hidden_pairs() const { return get_hidden(2); }
25 auto get_hidden_triplets() const { return get_hidden(3); }
26 auto get_hidden_quads() const { return get_hidden(4); }
28 auto get_naked_pairs() const { return get_naked(2); }
29 auto get_naked_triplets() const { return get_naked(3); }
30 auto get_naked_quads() const { return get_naked(4); }
32 auto get_pointing_row() const { return get_pointing(0x7, 0); }
33 auto get_pointing_col() const { return get_pointing(0x49, 1); }
35 private:
36 changes_t get_naked(uint8_t number) const;
37 changes_t get_hidden(uint8_t number) const;
38 changes_t get_pointing(uint16_t mask, size_t seen) const;
40 bool get_hidden(changes_t& res,
41 uint8_t orig,
42 uint8_t number,
43 uint8_t first,
44 uint16_t val,
45 uint16_t mask) const;
47 bool get_naked(changes_t& res,
48 uint8_t orig,
49 uint8_t number,
50 uint8_t first,
51 uint16_t val) const;
53 static constexpr const std::int64_t mask_field = (1U << 9U) - 1;
54 static constexpr const std::int64_t mask_value = 0x201008040201;
56 std::array<uint16_t, 9> m_value = {mask_field,
57 mask_field,
58 mask_field,
59 mask_field,
60 mask_field,
61 mask_field,
62 mask_field,
63 mask_field,
64 mask_field};
66 std::array<uint16_t, 9> m_ref = {mask_field,
67 mask_field,
68 mask_field,
69 mask_field,
70 mask_field,
71 mask_field,
72 mask_field,
73 mask_field,
74 mask_field};
76 std::array<uint16_t, 9> m_res = {0};
78 mutable std::array<uint16_t, 4> m_seen_hidden = {0};
79 mutable std::array<uint16_t, 4> m_seen_naked = {0};
80 mutable std::array<uint16_t, 2> m_seen_point = {0};
81 };
83 #endif