Workshop › Sudoku › Step 20 of 28
Solving an empty board gives a full, valid Sudoku grid, but always the same one. Shuffling the options makes the solver build a different random grid every time. This is the first half of inventing puzzles.
```js
// Counts solutions up to `limit`; `order` shuffles the digits to make random grids.
function countSolutions(board, limit = 2, order = false) {
const cell = bestCell(board)
if (!cell) return 1 // no empty cell left: solved
const { r, c, options } = cell
if (order) shuffle(options)
let count = 0
for (const d of options) {
board[r][c] = d
count += countSolutions(board, limit - count, order)
if (count >= limit) return count // keep the board as it is: that is the solution
board[r][c] = 0
}
return count
}
function shuffle(list) {
for (let i = list.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1))
;[list[i], list[j]] = [list[j], list[i]]
}
return list
}
```order defaults to false, so solving works as before; with true the options are shuffled first, all the way down.[a, b] = [b, a] swaps two values. The ; at the start keeps JavaScript from gluing the line to the one before.order.order is on, and pass order along in the recursive call.countSolutions, write shuffle.Skills: Arrays and objects
← The solver Invent a puzzle →