diff options
author | tomsmeding <tom.smeding@gmail.com> | 2018-09-02 11:30:03 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2018-09-02 11:30:03 +0200 |
commit | 9742ed3c4af77b4b0d138ab00ea1cebe037878ef (patch) | |
tree | 054c63ff12db06d3d84152f5066605accee4f6f6 | |
parent | 55261161c4cb05653c88f15e3537c1d514fefd2e (diff) |
-rw-r--r-- | solve_bt_bfs.cpp | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/solve_bt_bfs.cpp b/solve_bt_bfs.cpp index bf14218..672b167 100644 --- a/solve_bt_bfs.cpp +++ b/solve_bt_bfs.cpp @@ -70,52 +70,75 @@ static ostream& operator<<(ostream &os, const Sudoku &su) { return os; } +template <bool checkPoss> static bool isValid(const Sudoku &su) { for (int y = 0; y < 9; y++) { int i = 9 * y; - uint8_t seen[9]; - memset(seen, 0, 9); + + uint16_t seen = 0; + uint16_t seenPoss = 0; + for (int x = 0; x < 9; x++, i++) { int v = su[i]; if (v != -1) { - if (seen[v]) return false; - else seen[v] = 1; + if (seen & (1<<v)) return false; + else seen |= 1<<v; + } else { + if (checkPoss) seenPoss |= su.poss[i]; } } + + if (checkPoss) { + if ((seenPoss | seen) != 0x1ff) return false; + } } for (int x = 0; x < 9; x++) { int i = x; - uint8_t seen[9]; - memset(seen, 0, 9); + + uint16_t seen = 0; + uint16_t seenPoss = 0; + for (int y = 0; y < 9; y++, i += 9) { int v = su[i]; if (v != -1) { - if (seen[v]) return false; - else seen[v] = 1; + if (seen & (1<<v)) return false; + else seen |= 1<<v; + } else { + if (checkPoss) seenPoss |= su.poss[i]; } } + + if (checkPoss) { + if ((seenPoss | seen) != 0x1ff) return false; + } } int i = 0; for (int by = 0; by < 9; by += 3) { for (int bx = 0; bx < 9; bx += 3) { - uint8_t seen[9]; - memset(seen, 0, 9); + uint16_t seen = 0; + uint16_t seenPoss = 0; int j = i; for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { int v = su[j]; if (v != -1) { - if (seen[v]) return false; - else seen[v] = 1; + if (seen & (1<<v)) return false; + else seen |= 1<<v; + } else { + if (checkPoss) seenPoss |= su.poss[j]; } j++; } j += 6; } + if (checkPoss) { + if ((seenPoss | seen) != 0x1ff) return false; + } + i += 3; } i += 18; @@ -301,7 +324,7 @@ static Resolution solve(const Sudoku &su) { item.su[i] = v; scratchAround(item.su, i); - if (isValid(item.su)) { + if (isValid<true>(item.su)) { // item.maxposs = calcMaxposs(item.su); item.init = {i, v}; qu.push_back(move(item)); @@ -335,7 +358,7 @@ static Resolution solve(const Sudoku &su) { item.su[i] = v; scratchAround(item.su, i); - if (isValid(item.su)) { + if (isValid<true>(item.su)) { // item.maxposs = calcMaxposs(item.su); qu.push_back(move(item)); |