Sto sviluppando un risolutore Killer Sudoku per un progetto scolastico. Ho programmato 10 strategie umane che mostrano quello che stanno facendo per essere il più educativo possibile.
In questo momento è in grado di risolvere i Killer Sudokus, ma il mio insegnante mi ha proposto di utilizzare il backtracking per risolvere ogni possibile griglia.
Ho provato per una settimana a cercare risorse generali sul backtracking o sulle risorse basate su Sudoku ... Il fatto è che con Killer Sudoku, non puoi semplicemente dire che una cella ha una soluzione senza fare affidamento sulle zone e su ciò che le cellule scritte in precedenza implicano zone e possibilità ovunque.
Quello che mi piacerebbe fare è qualcosa che applica tutte le mie strategie ogni volta che suggerisce che un numero sia più efficiente e restituisca l'unica soluzione.
Ma per applicare le strategie, abbiamo bisogno di una copia della griglia giusto? Quindi posso clonare completamente i miei oggetti usando alcuni metodi e posso applicare le mie strategie usando un altro metodo.
Quale sarebbe la struttura per questa funzione?
PS: Ho provato più volte a scrivere del codice e ogni volta che la soluzione restituita era errata. (La griglia può essere facilmente verificata per la validità)
Era qualcosa del genere:
def bt(sudoku)
if sudoku.valid? then
true
else
sudoku2 = sudoku.clone
sudoku2.first_cell_not_solved.possibilities.each do |p|
sudoku2.first_cell_not_solved.solution = p
end
sudoku2.apply_all_strategies
if sudoku.completed?
return sudoku.valid?
else
bt(sudoku2)
end
end
end