Sì, so che non è una novità e ci sono già molte domande là fuori (ha persino il suo tag), ma mi piacerebbe creare un risolutore di Sudoku in Java esclusivamente allo scopo di mi sto allenando a scrivere codice più efficiente.Creazione di un risolutore di sudoku efficiente
Probabilmente il modo più semplice per farlo in un programma è avere un sacco di cicli di analisi per ogni colonna e riga, raccogliere i valori possibili di ogni cella, quindi eliminare le celle con una sola possibilità (che contengano solo 1 numero, o sono l'unica cella nella loro riga/colonna che contiene questo numero) finché non si ha un puzzle risolto. Naturalmente, un pensiero puro dell'azione dovrebbe sollevare una bandiera rossa nella mente di ogni programmatore.
Quello che sto cercando è la metodologia per risolvere il problema di questo ventoso nel modo più efficiente possibile (si prega di cercare di non includere troppo codice - voglio capire quella parte, me stesso).
Voglio evitare algoritmi matematici se possibile - quelli sarebbero troppo facili e al 100% non è il mio lavoro.
Se qualcuno fosse in grado di fornire un processo di pensiero efficiente, passo dopo passo, per risolvere un puzzle di Sudoku (sia da parte di un essere umano che di un computer), sarei molto felice :). Sto cercando qualcosa di vago (quindi è una sfida), ma abbastanza informativo (quindi non sono totalmente perso) per farmi iniziare.
Molte grazie,
Justian Meyer
EDIT:
Guardando il mio codice, ho avuto modo di pensare: che cosa sarebbe alcune delle possibilità per la memorizzazione di questi stati solving (vale a dire il Griglia Sudoku). Vengono in mente array 2D e array 3D. Quale potrebbe essere la migliore? Il 2D potrebbe essere più facile da gestire dalla superficie, ma gli array 3D fornirebbero anche il numero "box"/"cage".
EDIT:
Nevermind. Vado con un array 3D.
Inoltre, se si va con la "eliminazione fino a quando rimane una sola possibilità", non si sarà ancora in grado di risolvere alcuni sudoku. C'è una buona quantità di sudokus "più difficili" in cui devi effettivamente eseguire una sorta di ricerca prima di poter essere sicuro di quale numero inserire dove (DFS/BFS). Altrimenti, il looping di ogni colonna e così via non è davvero -tutto- orribile o inefficiente finché si impostano le strutture dati di conseguenza, ma come ho detto, non risolverà -all-sudokus. – wasatz
@wasatz: Sì, ho fatto un po 'di ricerche e l'ho trovato. Tuttavia, sembra che così tante altre persone abbiano trovato soluzioni di lavoro più efficienti che, anche se odio ammetterlo, sono molto al di sopra del mio livello di comprensione. –
@Justian, ho fatto alcuni googling veloci e ho trovato alcuni consigli per l'utilizzo del "Dancing Links Algorithm" (http://en.wikipedia.org/wiki/Dancing_Links). Non ho ancora visto questo algoritmo (e non ho davvero il tempo di leggerlo proprio in questo momento), ma sembra promettente. Forse qualcosa che vale la pena dare un'occhiata? :) – wasatz