... | ... |
@@ -10,7 +10,7 @@ Features: |
10 | 10 |
- Hunt And Kill |
11 | 11 |
- Handles mazes of any size |
12 | 12 |
- Random with seed (time in seconds since the epoch by default) |
13 |
- - Fairly slow (1000*1000 cells in ~4000ms) |
|
13 |
+ - Fairly fast (10000*10000 cells in ~1200ms) |
|
14 | 14 |
|
15 | 15 |
[`cxx-maze`]: https://git.rcrnstn.net/rcrnstn/cxx-maze |
16 | 16 |
|
... | ... |
@@ -19,7 +19,7 @@ Features: |
19 | 19 |
``` |
20 | 20 |
$ make |
21 | 21 |
$ ./maze dummy |
22 |
-3844ms |
|
22 |
+1264ms |
|
23 | 23 |
$ ./maze |
24 | 24 |
██ ████████████████████████████████████████████████████████████████████████████ |
25 | 25 |
██ ██ ██ ██ ██ ██ ████ |
... | ... |
@@ -56,8 +56,8 @@ Maze hunt_and_kill(int w, int h, unsigned seed, C callback = [](Maze &){}) |
56 | 56 |
// Entrance. |
57 | 57 |
maze(1, 0) = maze(1, 1) = Maze::PATH; |
58 | 58 |
// Interior. |
59 |
- auto cx = 1; |
|
60 |
- auto cy = 1; |
|
59 |
+ auto cx = 1; auto rx = 1; |
|
60 |
+ auto cy = 1; auto ry = 1; |
|
61 | 61 |
auto done = false; |
62 | 62 |
while (!done) |
63 | 63 |
{ |
... | ... |
@@ -86,19 +86,21 @@ Maze hunt_and_kill(int w, int h, unsigned seed, C callback = [](Maze &){}) |
86 | 86 |
continue; |
87 | 87 |
} |
88 | 88 |
// No neighbors, done unless there's an uncarved cell to restart at. |
89 |
- done = true; |
|
90 |
- for (auto ry = 1; ry < h && done; ry += 2) |
|
91 |
- for (auto rx = 1; rx < w && done; rx += 2) |
|
92 |
- if (maze(rx, ry) == Maze::WALL) |
|
93 |
- for (auto ny = -2; ny <= 2 && done; ny += 2) |
|
94 |
- for (auto nx = -2; nx <= 2 && done; nx += 2) |
|
95 |
- if (!nx != !ny) |
|
96 |
- if (maze(rx+nx, ry+ny) == Maze::PATH) |
|
97 |
- { |
|
98 |
- cx = rx+nx; |
|
99 |
- cy = ry+ny; |
|
100 |
- done = false; |
|
101 |
- } |
|
89 |
+ done = [&]() { |
|
90 |
+ for (; ry < h; ry += 2, rx = 1) |
|
91 |
+ for (; rx < w; rx += 2) |
|
92 |
+ if (maze(rx, ry) == Maze::WALL) |
|
93 |
+ for (auto ny = -2; ny <= 2; ny += 2) |
|
94 |
+ for (auto nx = -2; nx <= 2; nx += 2) |
|
95 |
+ if (!nx != !ny) |
|
96 |
+ if (maze(rx+nx, ry+ny) == Maze::PATH) |
|
97 |
+ { |
|
98 |
+ cx = rx+nx; |
|
99 |
+ cy = ry+ny; |
|
100 |
+ return false; |
|
101 |
+ } |
|
102 |
+ return true; |
|
103 |
+ }(); |
|
102 | 104 |
} |
103 | 105 |
// Exit. |
104 | 106 |
w -= (w + 1) % 2; |
... | ... |
@@ -121,7 +123,7 @@ int main(int argc, char const * []) |
121 | 123 |
else |
122 | 124 |
{ |
123 | 125 |
auto const t1 = steady_clock::now(); |
124 |
- hunt_and_kill(1000, 1000, 0); |
|
126 |
+ hunt_and_kill(10000, 10000, 0); |
|
125 | 127 |
auto const t2 = steady_clock::now(); |
126 | 128 |
std::cout << duration_cast<milliseconds>(t2 - t1).count() << "ms\n"; |
127 | 129 |
} |