project-euler

https://projecteuler.net/
Log | Files | Refs | README

commit aec228ba70680a76d1f167ac02501db5164d8cbf
parent 6c584817012d0e28a2483d577b28d7fdd6b22e5a
Author: mpizzzle <m@michaelpercival.xyz>
Date:   Tue, 29 Sep 2020 21:21:47 +0100

more minor refactoring

Diffstat:
MEuler_96.cpp | 42+++++++++++++++++++-----------------------
1 file changed, 19 insertions(+), 23 deletions(-)

diff --git a/Euler_96.cpp b/Euler_96.cpp @@ -70,35 +70,34 @@ void reset_subgroup(sudoku& puzzle, set& s, set& m, int l, int k) { } } -void found(sudoku& puzzle, int x, int i, int j, int k, int l, bool r, bool vert, std::array<set, 9>& h, std::array<set, 9>& v, set& s, set& m) { +void found(sudoku& puzzle, int x, int i, int j, int k, int l, bool r, std::array<set, 9>& h, std::array<set, 9>& v, set& s, set& m) { puzzle[i][j] = x; r = true; - vert = true; std::cout << "reduced i: " << i + 1 << ", j: " << j + 1 << " = " << x << std::endl; - + reset_hv(puzzle, h, v); reset_subgroup(puzzle, s, m, l, k); } sudoku reduce(sudoku puzzle) { - bool reduced, vert = true; + bool reduced; do { reduced = false; std::array<set, 9> h, v; - reset_hv(puzzle, h, v); + reset_hv(puzzle, h, v); for (int l = 0; l < 3; ++l) { for (int k = 0; k < 3; ++k) { set missing, subgroup; - reset_subgroup(puzzle, subgroup, missing, l, k); + reset_subgroup(puzzle, subgroup, missing, l, k); for (int i = l * 3; i < (l * 3) + 3; ++i) { for (int j = k * 3; j < (k * 3) + 3; ++j) { if (puzzle[i][j] <= 0) { if (missing.size() == 1) { - found(puzzle, *missing.begin(), i, j, k, l, reduced, vert, h, v, subgroup, missing); + found(puzzle, *missing.begin(), i, j, k, l, reduced, h, v, subgroup, missing); break; } @@ -111,21 +110,24 @@ sudoku reduce(sudoku puzzle) { } if (matches.size() == 1) { - found(puzzle, *matches.begin(), i, j, k, l, reduced, vert, h, v, subgroup, missing); + found(puzzle, *matches.begin(), i, j, k, l, reduced, h, v, subgroup, missing); break; } for (int x : missing) { if (subgroup.find(x) == subgroup.end()) { - if (((puzzle[(l * 3) + ((i + 1) % 3)][j] > 0 && !vert) - || h[(l * 3) + ((i + 1) % 3)].find(x) != h[(l * 3) + ((i + 1) % 3)].end()) - && ((puzzle[(l * 3) + ((i + 2) % 3)][j] > 0 && !vert) - || h[(l * 3) + ((i + 2) % 3)].find(x) != h[(l * 3) + ((i + 2) % 3)].end()) - && ((puzzle[i][(k * 3) + ((j + 1) % 3)] > 0 && vert) - || v[(k * 3) + ((j + 1) % 3)].find(x) != v[(k * 3) + ((j + 1) % 3)].end()) - && ((puzzle[i][(k * 3) + ((j + 2) % 3)] > 0 && vert) - || v[(k * 3) + ((j + 2) % 3)].find(x) != v[(k * 3) + ((j + 2) % 3)].end())) { - found(puzzle, x, i, j, k, l, reduced, vert, h, v, subgroup, missing); + int li1 = (l * 3) + ((i + 1) % 3), li2 = (l * 3) + ((i + 2) % 3), + kj1 = (k * 3) + ((j + 1) % 3), kj2 = (k * 3) + ((j + 2) % 3); + + if (((h[li1].find(x) != h[li1].end()) + && (h[li2].find(x) != h[li2].end()) + && ((puzzle[i][kj1] > 0) || v[kj1].find(x) != v[kj1].end()) + && ((puzzle[i][kj2] > 0) || v[kj2].find(x) != v[kj2].end())) || ( + (v[kj1].find(x) != v[kj1].end()) + && (v[kj2].find(x) != v[kj2].end()) + && ((puzzle[li1][j] > 0) || h[li1].find(x) != h[li1].end()) + && ((puzzle[li2][j] > 0) || h[li2].find(x) != h[li2].end()))) { + found(puzzle, x, i, j, k, l, reduced, h, v, subgroup, missing); break; } } @@ -135,12 +137,6 @@ sudoku reduce(sudoku puzzle) { } } } - - if (!reduced && vert) { - vert = false; - reduced = true; - } - } while (reduced); return puzzle;