2012-03-01 14 views
8

Mi sono imbattuto nel puzzle inclinato in Ubuntu. Voglio risolvere il puzzle logico e non per tentativi ed errori, eccCome risolvere questo puzzle logicamente senza tentativi ed errori

Le regole sono semplici:

  1. Dobbiamo riempire tutte le caselle con destra o sinistra inclinazione.
  2. Il numero di slant che toccano un numero deve essere uguale a quel numero.
  3. Nella scheda non sono consentiti loop. io, le inclinazioni non devono formare anelli.

Puzzle:

Question

Risposta automatica risolto:

enter image description here

dove si comincia?

+0

Certamente, avrete bisogno di un po 'di prove ed errori. Puoi escludere alcune opzioni in anticipo, ma non penso che questo possa essere fatto senza alcun backtracking. –

+1

@EAGER_STUDENT: Immagino tu intenda [questo gioco] (http://manpages.ubuntu.com/manpages/lucid/man6/slant.6.html)? Non puoi dare un'occhiata al codice sorgente per vedere come lo risolvono? – James

+0

@AakashM sì, posso risolvere logicamente le griglie semplici. Nelle griglie semplici ci sarà un numero come 0 o 4 o 1 all'angolo. Con questo come strumento risolverò. Quando la larghezza o l'altezza aumentano, il problema è che queste 3 cose non sono presenti nei puzzle più difficili. –

risposta

2

Invece di inclinazione sinistra e destra userò la barra (/) e la barra rovesciata (\).

Prendiamo un quadrato con gli angoli (x1) (11), dove x è tutto tranne 1. C'è uno di questi nell'angolo in alto a sinistra. Supponiamo che lo slant su quel quadrato sia una barra, che collega due 1. Quelle 1 sono "esaurite" e tutte le caselle che le toccano devono avere linee che non tocchino i numeri. Ma questo porta a situazioni impossibili perché avremmo una barra sia a sinistra che al di sotto della nostra casella, il che significa che il rimanente 1 tocca due slanti. La conclusione: se hai un quadrato con tre 1, allora la linea in quel quadrato deve toccare l'angolo che non è 1. Questa regola non può essere applicata nei bordi e negli angoli, ma se hai 1 nell'angolo devi disegnare la linea toccando quell'angolo.

I numeri 1 e 3 sono simmetrici e utilizzando una logica simile otteniamo un'altra regola: se si dispone di un quadrato con tre 3, la linea in quel quadrato deve toccare due di questi tre 3.

Ci sono più regole generali, ma non si applicano negli angoli. Ci devono essere quadrati che circondano la piazza in questione. Prendiamo un quadrato di due opposti (x1) (1y), dove xey sono qualsiasi cosa, incluso un no numero. C'è uno di questi due quadrati lontano dall'angolo in basso a sinistra.Supponiamo che lo slant su quel quadrato sia una barra, che collega due 1. Quelle 1 sono "esaurite" e tutte le caselle che le toccano devono avere linee che non tocchino i numeri. Ma questo porta ad aggirare gli 1. La conclusione: se hai un quadrato con due 1 opposti, allora la linea in quel quadrato non deve toccare quei due 1. Questa regola potrebbe non essere applicabile ai bordi del pannello.

I numeri 1 e 3 sono simmetrici, ma la regola precedente utilizza la regola "no loop" e non esiste alcuna regola simmetrica di "no loops of lateral lines" e pertanto non esiste alcuna regola che abbia due 3 opposti.

Ora che sai quale linea tocca l'1, puoi concludere che nessun'altra linea può toccarla. Possiamo generalizzare questo ragionamento alle seguenti regole di riempimento: se un numero x sta toccando x linee, allora tutti gli altri quadrati adiacenti hanno linee che non toccano il numero. E simmetricamente: se un numero x è un angolo di (4-x) quadrati con linee che non toccano il numero, allora tutti gli altri quadrati vicini devono avere linee che toccano il numero.

Cerca su google per il termine "Gokigen Naname" Ho trovato più regole. Uno è di circa due adiacenti (11), ma già Mweerden lo copriva.

Queste regole non sono sufficienti per risolvere il tabellone. Ci sono altre regole probabilmente. Ma alla fine l'algoritmo potrebbe dover indovinare.

+0

Non sono convinto che in ogni buon puzzle l'algoritmo dovrà fare una congettura (basata su una ragionevole quantità di esperienza per riprodurre la versione della collezione di puzzle portatile di Simon Tatham - http://www.chiark.greenend.org.uk /~sgtatham/puzzles/java/slant.html) ma per il resto sono d'accordo. Si tratta di trovare gli schemi che forniscono informazioni e quindi aggiungerli e quindi trovare altri modelli. Se stai facendo ipotesi allora non hai ancora abbastanza schemi. :) – Chris

+0

Il numero di pattern può essere così grande che sarebbe meglio supporre che avere un database di gigabyte di grandi dimensioni. – Dialecticus

+0

Hai ragione che ci sono momenti in cui solo testare un percorso per il fallimento può essere la soluzione migliore, ma la mia intuizione/esperienza suggerisce che non è questo il caso. È passato troppo tempo dall'ultima volta che ho giocato, quindi non ricordo tutte le regole che ho nella mia testa da usare e mettere qui. Se non fossi al lavoro, inizierei a giocare per ricordare a me stesso. ;-) – Chris

2

"Logicamente" è un termine molto ampio. Come menzionato da Orbling nei commenti, il backtracking può essere considerato logico. Si può anche capire "logicamente" nel senso di come risolverlo traducendolo in una formula logica. Dai commenti che raccolgo stai cercando di implementare un risolutore, simile forse ad un comune risolutore di Sudoku.

Un modo semplice per implementare un risolutore, simile a uno per Sudokus, è trovare determinati modelli. Per gli enigmi generati dal programma a cui fai riferimento, posso dire con ragionevole certezza che questo dovrebbe essere sufficiente a risolverli senza indovinare e tornare indietro.

Alcuni esempi di modelli ovvi sono <11> e >33<. Soprattutto 2 ha alcune proprietà "transitive". Ad esempio: <12...23 -> <12...23< (con 2 ... 2 una quantità arbitraria di 2 secondi). Prova il tuo risolutore su vari esempi e quando si blocca sono sicuro che hai trovato un esempio che può insegnarti un altro modello.