Nonogram solver
Revision | 24960c389317ab9d6c50dd9ccaef1134e75cd92a (tree) |
---|---|
Time | 2021-03-10 00:57:17 |
Author | Alexander Larin <scalar438@gmai...> |
Commiter | Alexander Larin |
Remove old placeability calculator
@@ -1,81 +0,0 @@ | ||
1 | -#pragma once | |
2 | -#include <type_traits> | |
3 | -#include <vector> | |
4 | - | |
5 | -namespace impl | |
6 | -{ | |
7 | -template <class T> class ReversedVectorConst | |
8 | -{ | |
9 | -public: | |
10 | - ReversedVectorConst(const std::vector<T> &data) : : m_data_ptr_const(&data) {} | |
11 | - ReversedVectorConst() {} | |
12 | - | |
13 | - typename std::vector<T>::const_reference operator[](size_t index) const | |
14 | - { | |
15 | - return *(m_data_ptr_const->rbegin() + index); | |
16 | - } | |
17 | - | |
18 | - size_t size() const { return m_data_ptr_const->size(); } | |
19 | - | |
20 | -protected: | |
21 | - const std::vector<T> *m_data_ptr_const; | |
22 | -}; | |
23 | - | |
24 | -template <class T> class ReversedVector : public ReversedVectorConst<T> | |
25 | -{ | |
26 | -public: | |
27 | - ReversedVector(std::vector<T> &data) : m_data_ptr(&data) {} | |
28 | - ReversedVector() {} | |
29 | - | |
30 | - typename std::vector<T>::reference operator[](size_t index) | |
31 | - { | |
32 | - return *(m_data_ptr->rbegin() + index); | |
33 | - } | |
34 | - | |
35 | - using ReversedVectorConst::operator[]; | |
36 | - | |
37 | - void resize(size_t new_size) { m_data_ptr->resize(new_size); } | |
38 | - | |
39 | - void set_data_ptr(std::vector<T> *data_ptr) | |
40 | - { | |
41 | - m_data_ptr = data_ptr; | |
42 | - m_data_ptr_const = data_ptr; | |
43 | - } | |
44 | - | |
45 | -protected: | |
46 | - std::vector<T> *m_data_ptr; | |
47 | -}; | |
48 | - | |
49 | -} // namespace impl | |
50 | - | |
51 | -template <class T> | |
52 | -class ReversedVector : public std::conditional_t<std::is_const_v<T>, impl::ReversedVectorConst<T>, | |
53 | - impl::ReversedVector<T>> | |
54 | -{ | |
55 | -public: | |
56 | - explicit ReversedVector(std::vector<T> &data) { set_data_ptr(&data); } | |
57 | - | |
58 | - ReversedVector() { set_data_ptr(&m_data); } | |
59 | - | |
60 | - ReversedVector(ReversedVector<T> &&old) noexcept : m_data(std::move(old.m_data)) | |
61 | - { | |
62 | - if (&old.m_data == old.m_data_ptr) | |
63 | - { | |
64 | - m_data_ptr = &m_data; | |
65 | - } | |
66 | - else | |
67 | - { | |
68 | - m_data_ptr = old.m_data_ptr; | |
69 | - } | |
70 | - } | |
71 | - | |
72 | - std::vector<T> move_out() | |
73 | - { | |
74 | - auto old_ptr = m_data_ptr; | |
75 | - set_data_ptr(&m_data); | |
76 | - return std::move(*old_ptr); | |
77 | - } | |
78 | - | |
79 | -private: | |
80 | - std::vector<T> m_data; | |
81 | -}; | |
\ No newline at end of file |
@@ -1,5 +1,4 @@ | ||
1 | 1 | #include "row_solver.hpp" |
2 | -#include "reversed_vector.hpp" | |
3 | 2 | #include <algorithm> |
4 | 3 | #include <set> |
5 | 4 | #include <string> |
@@ -27,6 +26,7 @@ | ||
27 | 26 | std::reverse(m_suffix_positions.begin(), m_suffix_positions.end()); |
28 | 27 | } |
29 | 28 | |
29 | + // return true if we can place first block_index blocks on first cell_index cells | |
30 | 30 | bool can_place_prefix(size_t cell_index, size_t block_index) const |
31 | 31 | { |
32 | 32 | if (block_index == 0) |
@@ -39,6 +39,7 @@ | ||
39 | 39 | } |
40 | 40 | } |
41 | 41 | |
42 | + // return true if we can place last block_index blocks on last n - cell_index cells | |
42 | 43 | bool can_place_suffix(size_t cell_index, size_t block_index) const |
43 | 44 | { |
44 | 45 | if (block_index == 0) |
@@ -100,48 +101,6 @@ | ||
100 | 101 | } |
101 | 102 | }; |
102 | 103 | |
103 | -template <class TCell, class TBlock, class TResult> | |
104 | -void calc_blocks_placeability(const TCell &cells, const TBlock &blocks, std::vector<TResult> &res) | |
105 | -{ | |
106 | - const size_t n = cells.size(); | |
107 | - if (n == 0) return; | |
108 | - const size_t k = blocks.size(); | |
109 | - | |
110 | - res.resize(k + 1); | |
111 | - res[0].resize(n + 1); | |
112 | - res[0][0] = true; | |
113 | - bool cur_value = true; | |
114 | - for (size_t i = 0; i != n; ++i) | |
115 | - { | |
116 | - if (cur_value && !cells[i].is_color_possible(0)) cur_value = false; | |
117 | - res[0][i + 1] = cur_value; | |
118 | - } | |
119 | - for (size_t i = 0; i != k; ++i) | |
120 | - { | |
121 | - res[i + 1].resize(n + 1); | |
122 | - res[i + 1][0] = false; | |
123 | - | |
124 | - int current_allowed_count = 0; | |
125 | - | |
126 | - int delta = i == 0 ? 1 : 0; | |
127 | - | |
128 | - cur_value = false; | |
129 | - | |
130 | - for (size_t j = 0; j < n; ++j) | |
131 | - { | |
132 | - if (cells[j].is_color_possible(blocks[i].color_number)) | |
133 | - current_allowed_count += 1; | |
134 | - else | |
135 | - current_allowed_count = 0; | |
136 | - if (!cur_value && j - blocks[i].block_length + delta <= n && | |
137 | - current_allowed_count >= blocks[i].block_length && | |
138 | - res[i][j - blocks[i].block_length + delta]) | |
139 | - cur_value = true; | |
140 | - res[i + 1][j + 1] = cur_value; | |
141 | - } | |
142 | - } | |
143 | -} | |
144 | - | |
145 | 104 | std::vector<size_t> calculate_row(std::vector<Cell> &cells, std::vector<Block> &blocks) |
146 | 105 | { |
147 | 106 | const size_t n = cells.size(); |
@@ -149,18 +108,7 @@ | ||
149 | 108 | |
150 | 109 | while (1) |
151 | 110 | { |
152 | - // can_place_prifix[i][j] == true if we can place first i blocks at the first j cells | |
153 | - // can_place_suffix - same, but for last i blocks and last n - j cells | |
154 | - std::vector<std::vector<bool>> can_place_prefix, can_place_suffix; | |
155 | - | |
156 | - calc_blocks_placeability(cells, blocks, can_place_prefix); | |
157 | - { | |
158 | - std::vector<ReversedVector<bool>> can_place_suffix_rev; | |
159 | - calc_blocks_placeability(ReversedVector(cells), ReversedVector(blocks), | |
160 | - can_place_suffix_rev); | |
161 | - for (auto &rev_vector : can_place_suffix_rev) | |
162 | - can_place_suffix.emplace_back(rev_vector.move_out()); | |
163 | - } | |
111 | + PlaceabilityCalculator pc(cells, blocks); | |
164 | 112 | |
165 | 113 | std::vector<Cell> new_cell_list; |
166 | 114 | { |
@@ -178,7 +126,7 @@ | ||
178 | 126 | bool can_place = false; |
179 | 127 | for (size_t j = 0; j <= blocks_count; ++j) |
180 | 128 | { |
181 | - if (can_place_prefix[j][i] && can_place_suffix[blocks_count - j][i + 1]) | |
129 | + if (pc.can_place_prefix(i, j) && pc.can_place_suffix(i + 1, blocks_count - j)) | |
182 | 130 | { |
183 | 131 | can_place = true; |
184 | 132 | break; |
@@ -216,9 +164,9 @@ | ||
216 | 164 | size_t delta_suffix = k == blocks_count - 1 ? 0 : 1; |
217 | 165 | |
218 | 166 | if (int(i) + 1 - blocks[k].block_length - delta_prefix <= n && |
219 | - can_place_prefix[k][i + 1 - blocks[k].block_length - delta_prefix] && | |
167 | + pc.can_place_prefix(i + 1 - blocks[k].block_length - delta_prefix, k) && | |
220 | 168 | i + delta_suffix + 1 <= n && |
221 | - can_place_suffix[blocks_count - k - 1][i + delta_suffix + 1]) | |
169 | + pc.can_place_suffix(i + delta_suffix + 1, blocks_count - k - 1)) | |
222 | 170 | { |
223 | 171 | for (size_t j = i - blocks[k].block_length + 1; j <= i; ++j) |
224 | 172 | { |