aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/sudoku/solve.ts
blob: eedb576735ef13d4a4a39d8ff20d71b36a6262c1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function solve() {
  let board = self.readBoard(true);
  let backtrack = 0;
  let guesswork = 0;
  let dcount = 0;
  let time = Date.now();
  if (solve()) {
    stats();
    self.writeBytes(board);
    el.classList.add("solved");
  } else {
    stats();
    alert("no solution");
  }
  function solve() {
    let { index, moves, len } = analyze(board);
    if (index == null) return true;
    if (len > 1) guesswork++;
    for (let m = 1; moves; m <<= 1) {
      if (moves & m) {
        dcount++;
        board[index] = m;
        if (solve()) return true;
        moves ^= m;
      }
    }
    board[index] = 0;
    ++backtrack;
    return false;
  }
  function stats() {
    log(el, `${dcount} digits placed<br>${backtrack} take-backs<br>${guesswork} guesses<br>${Date.now() - time} milliseconds`);
  }
}