Atölye › Sudoku › 19/28. adım

Çözücü

Ne yapıyoruz

Çö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
}
```

Ne işe yarıyor

Sıra sende

bestCell fonksiyonunun altına yorumları ve countSolutions fonksiyonunu yaz. Çalıştır.

Beceriler: Fonksiyonlar

Tüm adımlar

  1. Dokuza dokuz
  2. Çizgiler ve kutular
  3. Metinden bir bulmaca
  4. Bulmacanın kendi rakamları
  5. Çizmeye devam
  6. Seçili hücre
  7. Satırı, sütunu ve kutuyu aydınlat
  8. Her yerde aynı rakam
  9. Tıklayarak seç
  10. Oklarla gez
  11. Rakam yaz
  12. Tek döngüde üç kural
  13. Hataları göster
  14. Çözüldü!
  15. Saat
  16. Çözüldü mesajı
  17. Yeniden oyna
  18. En kolay hücre
  19. Çözücü
  20. Rastgele sıra
  21. Bulmaca icat et
  22. Her oyunda yeni bulmaca
  23. İpuçları
  24. En iyi süre
  25. Yeni bulmaca için N
  26. Rakam tuş takımı
  27. Tuş takımına dokun
  28. Kendin yap: geri al