Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo
Find X9 Ultra è lo smartphone che tanti aspettavano, e finalmente è arrivato anche in Italia. Abbiamo provato il flagship di OPPO per diverse settimane, e siamo volati fino in Cina alla sua presentazione ufficiale. Tutto gira intorno al suo incredibile comparto fotografico in collaborazione con Hasselblad e con un totale di sei fotocamere. Il resto è un mix di specifiche di altissimo livello, così come il prezzo. Vi raccontiamo tutto nella nostra recensione completa.
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-04-2011, 16:06   #1
tonio123
Member
 
Iscritto dal: Sep 2008
Messaggi: 155
[Java]Risolutore sudoku

Allora ho realizzato un programmino in java che risolve sudoku sfruttando questo algoritmo:
1)ogni casella all'inizio ha 9 valori possibili a meno che non le sia già stato assegnato un valore
2)scorro tutte le caselle togliendo ad ognuna i valori che non può avere perché già presenti nella sua riga/colonna/riquadro
3)se ad una casella rimane 1 solo valore possibile allora quello diventa il suo valore
4)se una casella è l'unica nella sua riga/colonna/riquadro che può assumere un certo valore lo assume
5)riparte dal punto 2 finché non fa un ciclo a vuoto, cioè senza cambiare valore a nessuna casella

In teoria così dovrei poter ottenere sempre una soluzione e in effetti con i sudoku medio/facili funziona, con quelli classificati come difficili invece non riesce a raggiungere una soluzione e rimane un 50% di caselle in bianco.
Quindi arrivando alla domanda, il mio algoritmo è incompleto/sbagliato?
Cioè senza ricorrere alla forza bruta randomizzando numeri c'è un modo per ottenere sempre una soluzione?

Ultima modifica di tonio123 : 16-04-2011 alle 16:10.
tonio123 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2011, 17:04   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da tonio123 Guarda i messaggi
Allora ho realizzato un programmino in java che risolve sudoku sfruttando questo algoritmo:
1)ogni casella all'inizio ha 9 valori possibili a meno che non le sia già stato assegnato un valore
2)scorro tutte le caselle togliendo ad ognuna i valori che non può avere perché già presenti nella sua riga/colonna/riquadro
3)se ad una casella rimane 1 solo valore possibile allora quello diventa il suo valore
4)se una casella è l'unica nella sua riga/colonna/riquadro che può assumere un certo valore lo assume
5)riparte dal punto 2 finché non fa un ciclo a vuoto, cioè senza cambiare valore a nessuna casella

In teoria così dovrei poter ottenere sempre una soluzione e in effetti con i sudoku medio/facili funziona, con quelli classificati come difficili invece non riesce a raggiungere una soluzione e rimane un 50% di caselle in bianco.
Quindi arrivando alla domanda, il mio algoritmo è incompleto/sbagliato?
Cioè senza ricorrere alla forza bruta randomizzando numeri c'è un modo per ottenere sempre una soluzione?

Quando ho tempo libero, gioco al sudoku. Non sono un esperto, ma mi piace cimentarmi con quelli medio/difficili.
Le regole che hai inserito sono ottime, ma non sufficienti, perche' per i puzzle piu' difficili devi "guardare avanti" di qualche mossa.

Puoi cominciare inserendo qualche regola in piu', per esempio:
- Supponi di avere 3 caselle libere in un riquadro 3x3. Nelle prime due caselle puoi inserire, per esempio, i numeri 5, 7 mentre nella terza casella puoi inserire i numeri 5, 7, 8 (cioe' un sovrainsieme dei precedenti).
Evidentemente potrai mettere il numero 8 nella terza casella, giusto?

In questo caso, seguendo le tue regole non potevi inserire alcun numero; in realta', potevi completare una casella. Si possono trovare altre regole di questo tipo.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2011, 17:33   #3
tonio123
Member
 
Iscritto dal: Sep 2008
Messaggi: 155
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Quando ho tempo libero, gioco al sudoku. Non sono un esperto, ma mi piace cimentarmi con quelli medio/difficili.
Le regole che hai inserito sono ottime, ma non sufficienti, perche' per i puzzle piu' difficili devi "guardare avanti" di qualche mossa.

Puoi cominciare inserendo qualche regola in piu', per esempio:
- Supponi di avere 3 caselle libere in un riquadro 3x3. Nelle prime due caselle puoi inserire, per esempio, i numeri 5, 7 mentre nella terza casella puoi inserire i numeri 5, 7, 8 (cioe' un sovrainsieme dei precedenti).
Evidentemente potrai mettere il numero 8 nella terza casella, giusto?

In questo caso, seguendo le tue regole non potevi inserire alcun numero; in realta', potevi completare una casella. Si possono trovare altre regole di questo tipo.
mm forse non ho capito bene, praticamente stai dicendo che se ho da completare solo 3 caselle in una riga/colonna/riquadro tali che:
1-->valori possibili:5,6
2-->valori possibili:5,6
3-->valori possibili:5,6,7
allora devo mettere la 3 al valore 7, se è così lo faccio già poiché la 3 è l'unica che può essere 7 e corrisponderebbe al passo 4 di quelli che ho scritta prima.
ma penso proprio di non aver capito
tonio123 è offline   Rispondi citando il messaggio o parte di esso
Old 16-04-2011, 22:01   #4
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da tonio123 Guarda i messaggi
mm forse non ho capito bene, praticamente stai dicendo che se ho da completare solo 3 caselle in una riga/colonna/riquadro tali che:
1-->valori possibili:5,6
2-->valori possibili:5,6
3-->valori possibili:5,6,7
allora devo mettere la 3 al valore 7, se è così lo faccio già poiché la 3 è l'unica che può essere 7 e corrisponderebbe al passo 4 di quelli che ho scritta prima.
ma penso proprio di non aver capito
Puoi trovare anche altre regole, te ne serve qualcuna in piu' per riuscire a risolvere tutti i possibili sudoku (ammesso che li abbiano creati in modo che si possano sempre risolvere, non so se esiste una regola).

Quello che dicevo e': hai un insieme di due caselle e hai determinato che in quelle caselle ci puo' stare il 5 ed il 6, ma non sai in quale ordine.
A questo punto, hai la fortuna di poter avere un SOVRAINSIEME delle stesse, cioe' tre caselle (le prime due caselle, piu' una terza). Ti accorgi che nel sovrainsieme i possibili numeri che ci possono stare sono 5,6,7. Domanda: dove andra' il 7? Ovviamente nella 3^ casella, anche se nella terza avrebbe potuto starci anche il 5 ed il 6...

Se vuoi, puoi anche pensare (per i puzzle veramente difficili) un sistema di "backtrack": hai applicato tutte le regole che conosci ma non sei riuscito a finire. Beh, allora fai un "tentativo ragionato", mettendo un numero (beh, saranno sempre due) in una posizione ragionevole e tentando la risoluzione. Se non risulta, puoi cancellare tutti i numeri fino al punto di backtrack e tentare una seconda volta...
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2011, 21:47   #5
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tonio123 Guarda i messaggi
Allora ho realizzato un programmino in java che risolve sudoku sfruttando questo algoritmo:
1)ogni casella all'inizio ha 9 valori possibili a meno che non le sia già stato assegnato un valore
2)scorro tutte le caselle togliendo ad ognuna i valori che non può avere perché già presenti nella sua riga/colonna/riquadro
3)se ad una casella rimane 1 solo valore possibile allora quello diventa il suo valore
4)se una casella è l'unica nella sua riga/colonna/riquadro che può assumere un certo valore lo assume
5)riparte dal punto 2 finché non fa un ciclo a vuoto, cioè senza cambiare valore a nessuna casella

In teoria così dovrei poter ottenere sempre una soluzione e in effetti con i sudoku medio/facili funziona, con quelli classificati come difficili invece non riesce a raggiungere una soluzione e rimane un 50% di caselle in bianco.
Quindi arrivando alla domanda, il mio algoritmo è incompleto/sbagliato?
Cioè senza ricorrere alla forza bruta randomizzando numeri c'è un modo per ottenere sempre una soluzione?
Con una semplice estensione al tuo algoritmo si puo' ottenerne uno che ottiene la soluzione in tempi molto rapidi.
In pratica quando non trovi nessuna casella con una soluzione possibile, ne prendi una con due e scegli uno dei due valori, se non raggiungi una soluzione torni indietro con l'altra strada. se non ci sono caselle con due valori ne prendi una da tre e cosi' via.
All'atto pratico funziona abbastanza bene.
Comunque se cerchi nel forum c'e' un vecchio contest in cui ci si cimentava nello scrivere solutori per sudoku, troverai diverse idee interessanti.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2011, 08:43   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quoto marco.r, con un algoritmo brute force + backtracking.
Ed eccoti il link al vecchio contest sul sudoku.
http://www.hwupgrade.it/forum/showthread.php?t=1995326
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2011, 08:58   #7
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Quoto marco.r, con un algoritmo brute force + backtracking.
Ed eccoti il link al vecchio contest sul sudoku.
http://www.hwupgrade.it/forum/showthread.php?t=1995326
Il concetto e' che all'atto pratico provare tutte le varie euristiche ha un suo costo in termini di cicli di cpu. Se l'esplorazione dell'albero delle scelte non va mai piu' di tanto in profondita', puo' essere meno costoso fare un paio di prove e scegliere la strada giusta.
Questo a patto di scegliere le alternative in modo intelligente (quella con la minor probabilita' di essere sbagliata), e impostando la struttura dati in modo che il "costo" per fare un tentativo sia molto basso.
Se guardi il mio esempio, riesce a risolvere in pochi millisecondi anche i sudoku piu' difficili elencati sulla pagina di wikipedia

http://en.wikipedia.org/wiki/Algorit...est_Sudokus.29
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2011, 09:10   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Il concetto e' che all'atto pratico provare tutte le varie euristiche ha un suo costo in termini di cicli di cpu. Se l'esplorazione dell'albero delle scelte non va mai piu' di tanto in profondita', puo' essere meno costoso fare un paio di prove e scegliere la strada giusta.
Immagino parli di questo:
Quote:
In pratica quando non trovi nessuna casella con una soluzione possibile, ne prendi una con due e scegli uno dei due valori, se non raggiungi una soluzione torni indietro con l'altra strada. se non ci sono caselle con due valori ne prendi una da tre e cosi' via.
e ok, sono d'accordo che è un'algoritmo più efficente.

Intendevo dire che per giungere a una soluzione è sufficiente introdurre il backtracing. Anche col backtracking si riesce a risolvere qualsiasi schema sudoku corretto, non importa quando sia "hard".
Certo il tuo algoritmo è più intelligente ed efficente.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2011, 09:23   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Immagino parli di questo:

e ok, sono d'accordo che è un'algoritmo più efficente.

Intendevo dire che per giungere a una soluzione è sufficiente introdurre il backtracing. Anche col backtracking si riesce a risolvere qualsiasi schema sudoku corretto, non importa quando sia "hard".
Certo il tuo algoritmo è più intelligente ed efficente.
Ah ma non stavo criticando il tuo intervento , era che ho premuto quote invece che rispondi, ma stiamo dicendo la stessa cosa .
La mia soluzione e' proprio bruteforce+backtracking, volevo solo elaborare sull'argomento e spiegare perche' funziona bene.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2011, 09:50   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da marco.r Guarda i messaggi
La mia soluzione e' proprio bruteforce+backtracking, volevo solo elaborare sull'argomento e spiegare perche' funziona bene.
Ok di nuovo: la differenza è che io nel contest non ho postato una soluzione al problema (il contest era relativo ad un solutore di schemi validi ma incompleti) invece avevo postato un generatore di schemi validi (usando lo stesso algoritmo, bf + backtracking).
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione OPPO Find X9 Ultra: è lui il cameraphone definitivo Recensione OPPO Find X9 Ultra: è lui il c...
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
WINDTRE BUSINESS potenzia i servizi IoT ...
OPPO rinnova l'ecosistema: arrivano Watc...
OPPO Find X9 Ultra ufficiale: debutta il...
Renault Twingo: esposta a Milano per far...
Intel vuole cambiare: overclocking anche...
Anche PlayStation introduce la verifica ...
Samsung ed Sk hynix, i bonus per gli ope...
Windows 11 velocizza Esplora File: ecco ...
Funzioni nascoste nelle librerie ADLX Ra...
Itala rinasce: lo storico marchio automo...
Huawei Watch Fit 5 e 5 Pro ufficiali: di...
ECOVACS DEEBOT T90 PRO OMNI vs Roborock ...
Fastweb scompare dai partner Starlink Mo...
Huawei anticipa tutti con Pura X Max: il...
Amazon Tech Week 2026: RTX 5000, process...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:03.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v