Come posso generare i puzzle di Sudoku?


17

Sto cercando di creare un generatore di puzzle di Sudoku. È molto più difficile di quanto mi aspettassi e più ci penso, più diventa difficile!

Il mio approccio attuale è quello di dividere il problema in 2 passaggi:

  1. Genera un puzzle di Sudoku completo (risolto).
  2. Rimuovi i numeri fino a quando non è risolvibile e ha solo 1 soluzione.

Nel passaggio 1, poiché sto usando metodi di forza bruta, sto affrontando alcuni problemi di runtime. Esiste un modo ottimale di compilare un puzzle di Sudoku completo?

Nel passaggio 2, che tipo di algoritmo dovrei usare per "confondere" un sudoku risolto?


questa domanda ha alcune informazioni che puoi estrarre su come generare enigmi
maniaco del cricchetto

3
Questa domanda è stata posta anche su Puzzle (e ha risposte migliori lì): puzzling.stackexchange.com/questions/142/…
congusbongus,

Risposte:


30

Ho un gioco Sudoku più venduto su app store iOS. Ecco come ho generato i puzzle.

Per prima cosa ho un'applicazione generatore di puzzle. Ma non fa parte del codice del gioco. E 'un'app stand alone che utilizzo per creare enigmi. È altamente modificato, quindi posso impostarlo per creare diversi tipi di pattern, livelli di difficoltà, numero di dati, ecc. Generare puzzle e ottenere un livello di difficoltà costante è difficile da fare al volo e richiede più tempo di quanto un giocatore vorrebbe aspettare. Quindi, creo quelli che chiamo "puzzle di semi" e questo è ciò che viene utilizzato dal codice del gioco per generare i puzzle che le persone giocano.

Non sto rispondendo a come codificare un generatore qui. Puoi google e trovare tonnellate di codice generatore di puzzle online. Inizia lì. Ma per fare un buon gioco devi fare un buon gioco. Il mio gioco non genera puzzle al volo.

Il modo in cui funziona la mia app generatore di puzzle è che genera migliaia di puzzle al minuto, ma non sono tutti buoni e non corrispondono tutti a un livello di difficoltà specifico. Il generatore crea un puzzle, quindi lo risolve, calcola un livello di difficoltà e calcola il puzzle in base alle tecniche necessarie per risolverlo, e determina se è necessario indovinarlo (che di solito è negativo). Elimina tutti i puzzle che non corrispondono a un criterio. Per i puzzle difficili ma non impossibili, su una macchina veloce, può essere necessaria un'ora per generare 100 puzzle che corrispondono alle mie specifiche esatte. Questo è il motivo per cui non lo faccio nell'app. Generare puzzle al volo con quelle specifiche difficili non funzionerebbe per la qualità dei puzzle che ho nella mia app.

I puzzle sono stringhe, lunghe 162 caratteri, 81 caratteri con numeri e trattini o punti in cui si troveranno gli spazi vuoti, quindi altri 81 con la soluzione. Quindi le colonne per ciascuna delle statistiche, come il numero di singoli, doppi, ecc.

Il mio output da tutte le sessioni di generazione sono linee delimitate da virgole con le statistiche come colonne. Prenderò forse 10.000 enigmi, li porterò per eccellere e li risolverò per difficoltà. Quindi portali in un'app per vederli sul tabellone. Li guardo anche per attrattiva visiva e motivi visibili per il puzzle. Poi seleziono a mano tra quelli.

Li chiamo puzzle di semi ed ecco cosa intendo. I numeri in un gioco di sudoku sono in realtà solo token. Invece di essere i numeri 1-9 potrebbero essere colori o simboli o lettere. Quindi i miei puzzle sui semi non sono numeri, sono le lettere ai. Ogni puzzle di seme viene cambiato al volo per creare un puzzle giocabile:

  1. Randomizza i numeri / token. Quando giro le lettere ai in numeri 1-9, la tabella di ricerca è casuale. Ciò significa che a non è sempre 1. Questo da solo crea circa 300.000 variazioni su ogni puzzle.
  2. Ruota il puzzle di 90, 180 o 270 gradi. Ciò aggiunge altre 4 varianti.
  3. Flop il puzzle in orizzontale, verticale o entrambi. Ciò aggiunge altre 4 varianti.

Ogni puzzle di semi può quindi creare 5.806.080 variazioni. L'ho provato sul campo con giocatori reali. Le persone non sanno che stanno essenzialmente giocando allo stesso puzzle. In realtà è impossibile. Solo se dovessero notare che lo schema in cui si trovano i dati è lo stesso ogni volta. Ma con anche 100 semi diversi nessuno noterà. Un milione di utenti del mio gioco no. L'ho anche testato con le app del solutore. Un'app risolutore non risolverà un puzzle allo stesso modo quando viene ruotata o flop. Talvolta lo analizzerà anche come un livello di difficoltà diverso anche se tecnicamente è lo stesso puzzle.

Tuttavia, Big Bad Sudoku Book ha 10 di 1000 puzzle di semi in 5 livelli di difficoltà e diversi tipi di schemi di puzzle. Ciò significa che ci sono miliardi di enigmi nel mio gioco. Ogni 10.000 seed seed ci sono 58.060.800.000 puzzle diversi.

In Sudoku Book versione 4 (in uscita nel 2016) ho trovato un modo per essere in grado di specificare un puzzle esatto tra quei 58 miliardi e ottenere lo stesso puzzle sul dispositivo di ogni giocatore.


Messaggio molto utile. Verifichi in qualche modo se i semi che generi possono essere creati da altri semi, nel senso che hai semi identici?
VLAS,

Sì. Li lascio tutti in compagno di testo e faccio una specie. Quindi rimuovere i duplicati. Non penso che sia mai stato rimosso. I semi sono assolutamente unici. È impossibile fare lo stesso puzzle da due semi diversi. Un giorno mostrerò il processo esatto ma non ora quando sto ancora approfittando dei miei metodi. :)
badweasel,

In realtà il mio intero processo è praticamente qui.
badweasel,

2
+1 per capire che i numeri sono solo token e il modo in cui è possibile effettuare variazioni è semplicemente modificare i numeri assegnati alle lettere.
S. Mitchell,

Risposta davvero utile! Poiché hai 3 colonne e 3 righe, dovresti essere in grado di spostare la colonna centrale a sinistra o a destra e la riga centrale in alto o in basso per generare altre 4 varianti. E invece di capovolgere il puzzle in verticale o di flopparlo in orizzontale, potresti semplicemente scambiare le colonne sinistra e destra (e le righe superiore e inferiore) con altre 4 varianti. Quindi penso che tu debba ottenere 43 milioni di variazioni da un seme.
Roger_S,

4

Nel passaggio (1) Genera un puzzle di Sudoku completo (risolto), poiché sto usando un metodo di forza bruta, sto affrontando alcuni problemi di runtime. Esiste un modo ottimale di compilare un puzzle di Sudoku completo?

C'è un modo semplice per compilare un puzzle di Sudoku completo: riempimento di gruppo e spostamento circolare.

  1. Riempi la prima riga con nove numeri diversi.
  2. Riempi la seconda riga che è uno spostamento della prima riga di tre slot.
  3. Riempi la terza riga che è uno spostamento della seconda riga di tre slot.
  4. Riempi la quarta riga che è uno spostamento del terzo di uno slot.


line 1: 8 9 3  2 7 6  4 5 1
line 2: 2 7 6  4 5 1  8 9 3 (shift 3)
line 3: 4 5 1  8 9 3  2 7 6 (shift 3)

line 4: 5 1 8  9 3 2  7 6 4 (shift 1)
line 5: 9 3 2  7 6 4  5 1 8 (shift 3)
line 6: 7 6 4  5 1 8  9 3 2 (shift 3)

line 7: 6 4 5  1 8 9  3 2 7 (shift 1)
line 8: 1 8 9  3 2 7  6 4 5 (shift 3)
line 9: 3 2 7  6 4 5  1 8 9 (shift 3)

Per impedire all'utente di notare il modello ovvio, potrebbe essere una buona idea randomizzare l'ordine delle righe e delle colonne in modo che non ci sia più alcun modello. Finché tutti e 9 i numeri di ogni riga / colonna si muovono insieme come un'unità atomica, la scheda Sudoku rimarrà sempre valida.

Ottieni un puzzle di Sudoku completo. Per maggiori dettagli, puoi cercare "Crea Sudoku".


3

Non è troppo difficile, a condizione che tu abbia un solutore di sudoku.

Fare i solutori del sudoku è un problema difficile / interessante, quindi è meglio salvarlo per una domanda diversa. Oppure puoi semplicemente leggere questo e vedere come vai.

  1. Per generare un puzzle risolto, esegui semplicemente il risolutore su una tavola vuota. L'unica avvertenza è che dovresti randomizzare le "ipotesi" utilizzate dal risolutore, altrimenti potresti finire con lo stesso puzzle ogni volta. Cioè, ad un certo punto il risolutore proverà un numero per una cella; potrebbe provarlo in questo ordine: 1, 2, 3, 4, ...e scegli il primo che funziona. È necessario mescolare che ordine in modo che si cerca, ad esempio, 4, 7, 2, 9, .... Questo processo dovrebbe essere veloce come il tuo risolutore.
  2. Per rimuovere i numeri, utilizzare questo algoritmo:
    • Scegli un numero casuale che non hai mai provato a rimuovere prima
    • Rimuovi il numero, esegui il solutore con la condizione aggiunta che non può utilizzare qui il numero rimosso
    • Se il solutore trova una soluzione, non è possibile rimuovere il numero
    • Ripeti fino a quando non hai rimosso abbastanza numeri (o non puoi più rimuoverli)

Questo è un metodo molto semplice (e ingenuo), quindi non c'è alcuna garanzia che otterrai enigmi di una certa difficoltà - a parte il numero di numeri mancanti che sono - o se puoi anche rimuovere la quantità di numeri che desideri. Spero che questo aiuti comunque.


Assicurarsi che il solutore non riesca a trovare più soluzioni dallo stesso stato. Normalmente dovrebbe esserci una sola soluzione. Inoltre, puoi verificare quali passaggi logici sono necessari al solutore per trovare la soluzione per determinare la difficoltà, ad esempio ha dovuto usare la strategia x-wing o ...?
OriginalDaemon,

1
@OriginalDaemon per quanto riguarda il tuo primo punto, è coperto nel terzo punto: se rimuovendo quel numero si ottiene una seconda soluzione, tornare indietro.
congusbongus,

0

Penso sia interessante sottolineare questa pagina Web , poiché mi ha aiutato molto per il nostro sviluppo di progetti. Fare un sudoku con una soluzione unica è lontano da un semplice compito. Nel link puoi trovare come l'autore (ha fatto davvero un ottimo lavoro, no no eh!), Ha trovato diverse strategie. Puoi avere un'idea per generare il tuo solutore Sudoku.

Ora, andando con l'argomento, c'è anche un modo per generare sudoku simili, proprio vicino

  1. La permutazione delle file.
  2. Un'altra soluzione semplice, è iniziare con un sudoku compilato di almeno 17 cifre compilare (è il minimo testato per trovare una soluzione unica), e compilare seguendo diverse strategie (ad esempio nel link precedente le strategie sono divise in difficoltà, tu può fare qualcosa di simile), fino a raggiungere la soluzione unica.
  3. C'era un elenco di un matematico che cercava di trovare un sudoku a 16 cifre con una soluzione unica iniziale, con un elenco HUGEEEEEE di sudoku a 17 cifre. Non ricordo se ha qualche tipo di copia, ma sono abbastanza sicuro, se puoi offrirgli altre 17 soluzioni uniche, il sudoku sarà più che felice di farti usare i suoi dati.

Saluti e buona fortuna con l'algoritmo: D


Hmm, il collegamento è per il risolutore di sudoku, non per il generatore.
Greenoldman,

@greenoldman SÌ, È UN SOLVER. Penso che sia interessante per l'utente poiché il suo metodo attuale è rimuovere un numero e risolverlo. Il link fornisce strategie per risolvere più velocemente i suoi sudoku parziali
David Sánchez,

0

Il mio risolutore utilizza la forza bruta e riesce a trovare la soluzione entro 20 millisecondi. Utilizzando il metodo di eliminazione, descritto sopra, il mio generatore produce un puzzle entro 200 millisecondi.

Generalmente genera un puzzle con circa 24-34 cifre rimaste, e ancora non so come riescano a produrre puzzle a 17 cifre nel mondo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.