From 0ca01985cd80dcdbca0c189d55bab73442ab43f4 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Wed, 23 Nov 2022 21:41:59 +0000 Subject: [PATCH] Add steps to test columns and segments back Turns out these are needed for some of them... I guess the way I was generating them was somehow avoiding tricky ones being created? --- solve.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/solve.c b/solve.c index a0d1420..9bda67f 100644 --- a/solve.c +++ b/solve.c @@ -22,7 +22,7 @@ int solve(struct sudoku *sud) { - unsigned r, c, n, val, np, pr, pc; + unsigned r, c, n, i, j, val, np, pr, pc; bool match; for (n = 0;; ++n) { @@ -41,7 +41,50 @@ int solve(struct sudoku *sud) break; } } + if (np == 1) { + if (update(sud, pr, pc, val) != OK) + return -1; + match = true; + } + } + } + /* Check if only one place a value can go on each column. */ + for (c = 0; c < NDIGITS; ++c) { + for (val = 0; val < NDIGITS; ++val) { + np = 0; + for (r = 0; r < NDIGITS; ++r) { + if (!sud->cells[r][c].det && sud->cells[r][c].pvals[val]) { + pr = r; + pc = c; + ++np; + if (np > 1) + break; + } + } + if (np == 1) { + if (update(sud, pr, pc, val) != OK) + return -1; + match = true; + } + } + } + + /* Check if only one place a value can go in each segment. */ + for (i = 0; i < NDIGITS; ++i) { + for (val = 0; val < NDIGITS; ++val) { + np = 0; + for (j = 0; j < NDIGITS; ++j) { + r = SEGLEN * (i / SEGLEN) + j / SEGLEN; + c = SEGLEN * (i % SEGLEN) + j % SEGLEN; + if (!sud->cells[r][c].det && sud->cells[r][c].pvals[val]) { + pr = r; + pc = c; + ++np; + if (np > 1) + break; + } + } if (np == 1) { if (update(sud, pr, pc, val) != OK) return -1;