Atölye › Sudoku › 19/28. adım
Çözücünün fikri çok zarif: en kolay hücreye seçeneklerinden birini dene, sonra tahtanın geri kalanını aynı fonksiyonla çöz. Kendini çağıran fonksiyona özyinelemeli (recursive) denir. Deneme bir yere çıkmazsa rakamı geri al ve sıradaki seçeneği dene; buna geri izleme (backtracking) denir. Labirentte çıkmaz sokağa girince geri dönüp başka yola sapmak gibi.
Fonksiyon bulduğu çözümleri sayar; bir sınıra (limit) ulaşınca durur. Neden sayıyor? İyi bir sudokunun tek
çözümü olmalı; ileride bunu kontrol edeceğiz.
```js
// Backtracking: fill a cell with each digit that fits and try to solve the rest; undo when stuck.
// Counts solutions up to `limit`.
function countSolutions(board, limit = 2) {
const cell = bestCell(board)
if (!cell) return 1 // no empty cell left: solved
const { r, c, options } = cell
let count = 0
for (const d of options) {
board[r][c] = d
count += countSolutions(board, limit - count)
if (count >= limit) return count // keep the board as it is: that is the solution
board[r][c] = 0
}
return count
}
```limit = 2 → parametre verilmezse 2 kullanılır (varsayılan değer).if (!cell) return 1 → boş hücre kalmadıysa tahta çözülmüş: bir çözüm.const { r, c, options } = cell → nesnenin alanlarını ayrı adlara aç.board[r][c] = d → seçeneği dene.countSolutions(board, limit - count) → tahtanın geri kalanını aynı fonksiyonla çöz (özyineleme). Dönen sayı o
denemeden çıkan çözüm sayısı.if (count >= limit) return count → yeterince çözüm bulunduysa dur; tahta dolu kalır, o da bir çözüm.board[r][c] = 0 → deneme bitti, geri al (geri izleme) ve sıradaki seçeneğe geç.bestCell fonksiyonunun altına yorumları ve countSolutions fonksiyonunu yaz. Çalıştır.
Beceriler: Fonksiyonlar
← En kolay hücre Rastgele sıra →