diff options
Diffstat (limited to 'Source/Randomizer2Core.cpp')
-rw-r--r-- | Source/Randomizer2Core.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/Source/Randomizer2Core.cpp b/Source/Randomizer2Core.cpp index 2659076..8bd5765 100644 --- a/Source/Randomizer2Core.cpp +++ b/Source/Randomizer2Core.cpp | |||
@@ -6,40 +6,46 @@ | |||
6 | #include <iostream> | 6 | #include <iostream> |
7 | #include <cassert> | 7 | #include <cassert> |
8 | 8 | ||
9 | std::vector<Pos> Randomizer2Core::CutEdgesToBeUnique(const Puzzle& p) { | 9 | // @Cutnpaste |
10 | auto [colorGrid, numColors] = CreateColorGrid(p); | 10 | std::vector<Pos> Randomizer2Core::CutEdges(const Puzzle& p, size_t numEdges) { |
11 | std::vector<Pos> edges; | 11 | std::vector<Pos> edges; |
12 | for (int x=0; x<p.width; x++) { | 12 | for (int x=0; x<p.width; x++) { |
13 | for (int y=0; y<p.height; y++) { | 13 | for (int y=0; y<p.height; y++) { |
14 | if (x%2 == y%2) continue; | 14 | if (x%2 == y%2) continue; |
15 | if (p.grid[x][y].gap != Cell::Gap::NONE) continue; | 15 | if (p.grid[x][y].gap != Cell::Gap::NONE) continue; |
16 | |||
17 | // If the puzzle already has a sequence, don't cut along it. | ||
18 | bool inSequence = false; | ||
19 | for (Pos pos : p.sequence) inSequence |= (pos.x == x && pos.y == y); | ||
20 | if (inSequence) continue; | ||
16 | edges.emplace_back(Pos{x, y}); | 21 | edges.emplace_back(Pos{x, y}); |
17 | } | 22 | } |
18 | } | 23 | } |
19 | return CutEdgesInternal(p, colorGrid, edges, numColors); | 24 | return CutEdgesInternal(p, edges, numEdges); |
20 | } | 25 | } |
21 | 26 | ||
22 | void Randomizer2Core::CutEdgesNotOutsideNotBreakingSequence(Puzzle& p, size_t numEdges) { | 27 | std::vector<Pos> Randomizer2Core::CutEdges2(const Puzzle& p, size_t numEdges) { |
23 | auto [colorGrid, numColors] = CreateColorGrid(p); | ||
24 | assert(numEdges <= numColors); | ||
25 | std::vector<Pos> edges; | 28 | std::vector<Pos> edges; |
29 | // Note the iterator bounds; we skip the outer edges. | ||
26 | for (int x=1; x<p.width-1; x++) { | 30 | for (int x=1; x<p.width-1; x++) { |
27 | for (int y=1; y<p.height-1; y++) { | 31 | for (int y=1; y<p.height-1; y++) { |
28 | if (x%2 == y%2) continue; | 32 | if (x%2 == y%2) continue; |
29 | if (p.grid[x][y].gap != Cell::Gap::NONE) continue; | 33 | if (p.grid[x][y].gap != Cell::Gap::NONE) continue; |
34 | |||
35 | // If the puzzle already has a sequence, don't cut along it. | ||
30 | bool inSequence = false; | 36 | bool inSequence = false; |
31 | for (Pos pos : p.sequence) inSequence |= (pos.x == x && pos.y == y); | 37 | for (Pos pos : p.sequence) inSequence |= (pos.x == x && pos.y == y); |
32 | if (inSequence) continue; | 38 | if (inSequence) continue; |
33 | edges.emplace_back(Pos{x, y}); | 39 | edges.emplace_back(Pos{x, y}); |
34 | } | 40 | } |
35 | } | 41 | } |
36 | std::vector<Pos> cutEdges = CutEdgesInternal(p, colorGrid, edges, numEdges); | 42 | return CutEdgesInternal(p, edges, numEdges); |
37 | for (Pos pos : cutEdges) { | ||
38 | p.grid[pos.x][pos.y].gap = Cell::Gap::FULL; | ||
39 | } | ||
40 | } | 43 | } |
41 | 44 | ||
42 | std::vector<Pos> Randomizer2Core::CutEdgesInternal(const Puzzle& p, std::vector<std::vector<int>>& colorGrid, std::vector<Pos>& edges, size_t numEdges) { | 45 | std::vector<Pos> Randomizer2Core::CutEdgesInternal(const Puzzle& p, std::vector<Pos>& edges, size_t numEdges) { |
46 | auto [colorGrid, numColors] = CreateColorGrid(p); | ||
47 | assert(numEdges <= numColors); | ||
48 | |||
43 | std::vector<Pos> cutEdges; | 49 | std::vector<Pos> cutEdges; |
44 | for (int i=0; i<numEdges; i++) { | 50 | for (int i=0; i<numEdges; i++) { |
45 | for (int j=0; j<edges.size(); j++) { | 51 | for (int j=0; j<edges.size(); j++) { |
@@ -79,6 +85,7 @@ std::vector<Pos> Randomizer2Core::CutEdgesInternal(const Puzzle& p, std::vector< | |||
79 | } | 85 | } |
80 | } | 86 | } |
81 | } | 87 | } |
88 | assert(cutEdges.size() == numEdges); | ||
82 | return cutEdges; | 89 | return cutEdges; |
83 | } | 90 | } |
84 | 91 | ||