Atölye › Sudoku › 20/28. adım
Boş bir tahtayı çözdürürsen çözücü dolu, geçerli bir sudoku ızgarası üretir; ama hep aynısını, çünkü seçenekleri hep 1, 2, 3... sırasıyla dener. Seçenekleri karıştırırsak her seferinde farklı, rastgele bir ızgara çıkar. Bulmaca icat etmenin ilk yarısı bu.
Karıştırmak için bilinen, adil bir yöntem kullanıyoruz: Fisher–Yates karıştırması.
```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 = false → varsayılan kapalı: çözücü eskisi gibi çalışır. true verilirse her hücrede seçenekler önce
karıştırılır; özyinelemeli çağrıya da aktarılır.shuffle → Fisher–Yates: listenin sonundan başla, her elemanı kendisi ya da kendinden önceki rastgele bir
elemanla yer değiştir. Her sıralama eşit olasılıklı olur.Math.floor(Math.random() * (i + 1)) → 0 ile i arası rastgele sıra.[list[i], list[j]] = [list[j], list[i]] → iki değeri tek satırda takas et.; → JavaScript bu satırı üstündekine yapıştırıp yanlış anlamasın diye (köşeli parantezle başlayan
satırlarda gerekli).order = false eklenir).const { r, c, options } = cell satırının altına if (order) shuffle(options) yaz; özyinelemeli çağrıya , order
ekle.countSolutions'ın altına bir boş satır bırakıp shuffle fonksiyonunu yaz.Beceriler: Diziler ve nesneler