• R/O
  • SSH

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Nonogram solver


Commit MetaInfo

Revision24960c389317ab9d6c50dd9ccaef1134e75cd92a (tree)
Time2021-03-10 00:57:17
AuthorAlexander Larin <scalar438@gmai...>
CommiterAlexander Larin

Log Message

Remove old placeability calculator

Change Summary

Incremental Difference

diff -r 8b22bbd65b14 -r 24960c389317 row_solver/impl/reversed_vector.hpp
--- a/row_solver/impl/reversed_vector.hpp Mon Mar 08 19:49:26 2021 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -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
diff -r 8b22bbd65b14 -r 24960c389317 row_solver/impl/row_solver.cpp
--- a/row_solver/impl/row_solver.cpp Mon Mar 08 19:49:26 2021 +0300
+++ b/row_solver/impl/row_solver.cpp Tue Mar 09 18:57:17 2021 +0300
@@ -1,5 +1,4 @@
11 #include "row_solver.hpp"
2-#include "reversed_vector.hpp"
32 #include <algorithm>
43 #include <set>
54 #include <string>
@@ -27,6 +26,7 @@
2726 std::reverse(m_suffix_positions.begin(), m_suffix_positions.end());
2827 }
2928
29+ // return true if we can place first block_index blocks on first cell_index cells
3030 bool can_place_prefix(size_t cell_index, size_t block_index) const
3131 {
3232 if (block_index == 0)
@@ -39,6 +39,7 @@
3939 }
4040 }
4141
42+ // return true if we can place last block_index blocks on last n - cell_index cells
4243 bool can_place_suffix(size_t cell_index, size_t block_index) const
4344 {
4445 if (block_index == 0)
@@ -100,48 +101,6 @@
100101 }
101102 };
102103
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-
145104 std::vector<size_t> calculate_row(std::vector<Cell> &cells, std::vector<Block> &blocks)
146105 {
147106 const size_t n = cells.size();
@@ -149,18 +108,7 @@
149108
150109 while (1)
151110 {
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);
164112
165113 std::vector<Cell> new_cell_list;
166114 {
@@ -178,7 +126,7 @@
178126 bool can_place = false;
179127 for (size_t j = 0; j <= blocks_count; ++j)
180128 {
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))
182130 {
183131 can_place = true;
184132 break;
@@ -216,9 +164,9 @@
216164 size_t delta_suffix = k == blocks_count - 1 ? 0 : 1;
217165
218166 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) &&
220168 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))
222170 {
223171 for (size_t j = i - blocks[k].block_length + 1; j <= i; ++j)
224172 {