Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia
Sony Xperia 1 VII propone un design sobrio e funzionale, con un comparto fotografico di ottimo livello caratterizzato da uno zoom continuo e prestazioni generali da top di gamma puro. Viene proposto con una personalizzazione software sobria e affidabile, ma presenta qualche criticità sul fronte ricarica rapida. Il dispositivo punta su continuità stilistica e miglioramenti mirati, rivolgendosi al solito pubblico specifico del brand giapponese.
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Attenti a Poco F7: può essere il best buy del 2025. Recensione
Poco F7 5G, smartphone che punta molto sulle prestazioni grazie al processore Snapdragon 8s Gen 4 e a un display AMOLED da ben 6,83 pollici. La casa cinese mantiene la tradizione della serie F offrendo specifiche tecniche di alto livello a un prezzo competitivo, con una batteria generosissima da 6500 mAh e ricarica rapida a 90W che possono fare la differenza per gli utenti più esigenti.
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-12-2005, 20:25   #1
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
[C++] Risolvere Sudoku

Oggi ho visto sul giornale sto gioco e mi sono prefisso, come esercizio di programmazione, di riuscire a fare un programma che, dati i numeri iniziali, completi il resto della tabella...
Il problema è che non so da che parte analizzare il problema... [tra l'altro non ci ho mai giocato :P] però il meccanismo è piuttosto semplice...

quindi chiedo a voi se avete qualche suggerimento o qualche idea su come implementare un algoritmo o simile...

grazie in anticipo!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 18:56   #2
Darecon
Senior Member
 
Iscritto dal: Sep 2003
Città: Tradate
Messaggi: 396
Azz, servirebbe anche a me
Darecon è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 19:11   #3
subvertigo
Senior Member
 
L'Avatar di subvertigo
 
Iscritto dal: Dec 2002
Città: Milano
Messaggi: 5062
ogni casella del sudoku la vedi come un array di 9 interi da 1 a 9.
Fai un ciclo che passa tutte le caselle e che ad ogni passata "barra" i numeri delle varie caselle (sia sulla riga, sia sulla colonna, sia nel riquadro) che NON possono essere. Ogni volta che rimane un solo numero nell'array della casella allora quello sarà il definitivo.
Il ciclo termina quando dopo una passata non ci sono differenze.

Tuttavia credo proprio che questo algoritmo compia una risoluzione parziale (cioè non riesce a risolverlo tutto)... dopo bisogna applicare altri algoritmi. Se non si riesce a trovarne di migliori, la forza bruta (provi numeri a caso, quando hai contraddizione rifai, altrimenti è giusto)....

Ultima modifica di subvertigo : 03-12-2005 alle 19:16.
subvertigo è offline   Rispondi citando il messaggio o parte di esso
Old 03-12-2005, 23:38   #4
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
il problema è proprio che a volte certi ragionamenti nella risoluzione saltano all'occhio dopo un po' ad un essere pensante, mentre ad un computer non gli passa neanche dalla ram di seguire un procedimento logico ma non previsto dall'algoritmo che sta processando... parlo da accanito risolvitore dei sudoku "diabolici" del corriere (tanto me lo regalano...), per prevedere proprio TUTTO ci vogliono parecchie prove e "campi di allenamento" per il programma, in modo da vedere dove si ferma e trovare il modo di risolverlo prima dal punto di vista umano e poi dal punto di vista della macchina.

altrimenti si va di bruteforce mettendo numeri random cercando che tutto torni da sè, ma specialmente all'inizio ci sono migliaia di possibilità...
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 09:02   #5
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Purtroppo per ka0s, il Sudoku è NP-completo.
Per cui: o non esiste alcun modo generale per risolvere velocemente uno schema di Sudoku arbitrario, oppure RSA è crackabile in tempo polinomiale.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 09:09   #6
redcloud
Bannato
 
L'Avatar di redcloud
 
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
Ecco questo http://www.salcappalonga.it/sudoku/

e questo http://www.dcs.warwick.ac.uk/~pwg/cs301/sudoku.html
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 14:01   #7
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
Grazie per i link e per le risposte!
Però non ho ben capito cosa voglia dire che il sudoku è NP-completo... tra l'altro mi sfugge anche il significato di "tempo polinomiale"... vuol dire che non si può risolvere in un tempo accettabile per l'uomo?
In effetti usando il metodo del brute force le combinazioni sono una marea... ma in ogni caso credo che un metodo per risolverlo esista (magari per gli schemi semplici o intermedi soltanto). In giro ci sono dei programmi che lo fanno... però volevo capire come si potesse implementare in un prog in c++!
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 14:29   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da ka0s
Grazie per i link e per le risposte!
Però non ho ben capito cosa voglia dire che il sudoku è NP-completo... tra l'altro mi sfugge anche il significato di "tempo polinomiale"... vuol dire che non si può risolvere in un tempo accettabile per l'uomo?
In effetti usando il metodo del brute force le combinazioni sono una marea... ma in ogni caso credo che un metodo per risolverlo esista (magari per gli schemi semplici o intermedi soltanto). In giro ci sono dei programmi che lo fanno... però volevo capire come si potesse implementare in un prog in c++!
Il problema e' complesso quando hai la griglia vuota (ovvero per chi ti deve preparare il gioco), se devi risolverlo hai gia' diversi indizi e si puo' fare con un numero limitato di calcoli (e d''altra parte deve essere in grado di risolverlo una persona).
L'idea di provare tutte le combinazioni non e' sbagliata del tutto, basta partire con le piu' probabili (e quindi le posizioni certe in primis), ed e' quello che in effetti fa una persona quando lo risolve a mano.
Una implementazione naive dell'algoritmo potrebbe essere la seguente (in python, con alcune funzioni accessorie omesse):
Codice:
def risolviSudoku( celleLibere ):
    """
    Prendi una cella libera, e togli dalle altre rimanenti tutte le incompatibili.
    torna una lista con la cella scelta e la soluzione ricorsiva delle celle rimanenti
    """
    for cella  in ordina(celleLibere):
        (riga,colonna,numero) = cella
        compatibili = [ (r,c,n) for (r,c,n) in celleLibere if (r,n) != (riga,numero) and (c,n) != (colonna,numero) and (riga,colonna) != (r,c) and ( box(r,c) , n ) != (box(riga,colonna) , numero )]
        resto = risolviSudoku( compatibili )
        if resto != None:
            return [ (riga,colonna,numero) ] + resto
    return None

def sudoku( celleIniziali, dimensione ):
    tutte = tutteLeCelle(dimensione)
    libere = sottrai( tutte , celleIniziali )
    return risolviSudoku( libere )
Il codice e' la trasposizione abbastanza pedissequa dell'idea:
- ordina le possibili celle (intesa come una terna (riga,colonna,numero) ) dalle piu' probabili alle meno probabili
- prendine una, togli dalle altre tutte quelle incompatibili con questa e ripeti la procedura

Il trucco e' tutto nella funzione ordina, che fa si' che il programma provi prima le caselle dove ci sono meno alternative in modo da limitare il danno in caso di errore.
Con i problemi delle rivista questo vuol dire di solito che per la maggior parte delle caselle si tratta di scegliere tra uno o due valori, per cui la soluzione si trova con una certa velocita'.
Disclaimer: non ho ancora provato il codice, non mi assumo la responsabilita' per eventuali errori
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 14:36   #9
vlacus
Member
 
L'Avatar di vlacus
 
Iscritto dal: May 2003
Messaggi: 118
Il fatto che il sudoku sia difficile da risolvere perchè NP-completo è una cavolata, in quanto lo schema non dipende da nessun parametro essendo sempre un 9x9 e quindi nessuno ci vieta di risolverlo in tempo costante.
__________________
forum che tratta di calcolatrici grafiche in genere: consigli e aiuti www.helpcalculator.tk
vlacus è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 14:36   #10
Minelab
Member
 
Iscritto dal: Mar 2003
Città: Provincia di Como
Messaggi: 223
Io l'ho scritto (ad Agosto all'apice della sua popolarità) con il VB di Excel con il seguente algoritmo.
Per ogni casella vuota ricerca solo i numeri che possono essere inseriti in base a riga, colonna e riquadro. Nel caso il risultato fosse un solo numero la casella vene riempito. Il ciclo continua finchè ci sono caselle da riempire.
Con solo questa parte di codice si riescono a risolvere gli schemi Facile Medio e Difficile (almeno quelli che ho provato io).
Per il Diabolico invece non è sufficiente e occorre passare alla forza bruta. Per limitare al minimo il numero di combinazioni possibili ho seguito la seguente strada: per ogni casella rimasta vuota ho memorizzato i possibili numeri inseribili ed ho cominciato ad estrarli casualmente. Mi sono però accorto che anche così i tempi sono biblici.
Probabilmente, visto che l'ho implementata ma solo testata inserendo il numero a mano, la via corretta è quella di individuare se c'è una casella che possa accettare solo 2 numeri. A questo punto se ne inserisce uno e si applica la prima parte del codice (per intedenrci quello risolve i primi 3 gradi di difficoltà) e se è quello corretto il gioco è risolto. In caso contrario si inserisce l'altro.
Quest'ultima parte non ho avuto modo di testarla a fondo quindi non so se funzioni sempre anche perchè poi ho abbandonato per dedicarmi allo sviluppo di database con Access.
Minelab è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 17:31   #11
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da marco.r
Disclaimer: non ho ancora provato il codice, non mi assumo la responsabilita' per eventuali errori

e in effetti ho dimenticato un paio di cosette, come accorgersi quando la soluzione viene trovata
stasera se ho tempo la sistemo :P
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 04-12-2005, 18:57   #12
FedeX_65246X
Member
 
Iscritto dal: Feb 2005
Città: Milano
Messaggi: 35
Avevo fatto un programmino Java (o C#, non ricordo) con algoritmo forza bruta; le tabelle 9x9 sono così piccole che possono essere risolte rapidamente anche con algoritmi "stupidi".
__________________
Res ipsa loquitur
FedeX_65246X è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 18:32   #13
ka0s
Member
 
Iscritto dal: Nov 2005
Messaggi: 151
grazie per le risp
vedrò quel che riesco a fare
__________________
ka0s
ka0s è offline   Rispondi citando il messaggio o parte di esso
Old 05-12-2005, 18:46   #14
Furla
Senior Member
 
Iscritto dal: Feb 2004
Messaggi: 1454
ora lo faccio anche io in vb.net

cmq spesso quando l'"eliminazione per caselle certe" non è sufficiente si passa all'eliminazione per caselle certe a coppie o a tre", o basandosi sul fatto che nessuna altra casella della stessa riga/colonna/quadrato accetta un certo numero. quindi algoritmi "advanced" per la risoluzione di schemi più difficili si possono sviluppare su queste logiche. certo che se non si sanno risolvere manualmente gli schemi più difficili, è difficile fare un algoritmo "non bruteforce" (ovvero che non rischi di metterci più di un essere umano a risolverlo) che li risolva.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 21:03   #15
FedeX_65246X
Member
 
Iscritto dal: Feb 2005
Città: Milano
Messaggi: 35
Quote:
Originariamente inviato da Furla
certo che se non si sanno risolvere manualmente gli schemi più difficili, è difficile fare un algoritmo "non bruteforce" (ovvero che non rischi di metterci più di un essere umano a risolverlo) che li risolva.
Per la cronaca, il sudoku pubblicato qui
(Figura 2, a sinistra), viene "brillantemente" risolto dal mio programmino in soli 3981602 tentativi, quando si dice forza bruta...
__________________
Res ipsa loquitur
FedeX_65246X è offline   Rispondi citando il messaggio o parte di esso
Old 06-12-2005, 23:47   #16
vlacus
Member
 
L'Avatar di vlacus
 
Iscritto dal: May 2003
Messaggi: 118
a me lo stesso lo fa con 63 tentativi
__________________
forum che tratta di calcolatrici grafiche in genere: consigli e aiuti www.helpcalculator.tk
vlacus è offline   Rispondi citando il messaggio o parte di esso
Old 07-12-2005, 15:27   #17
FedeX_65246X
Member
 
Iscritto dal: Feb 2005
Città: Milano
Messaggi: 35
Mmh, azzecca tutti i numeri al primo colpo?
Non male...
__________________
Res ipsa loquitur
FedeX_65246X è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2005, 00:00   #18
vlacus
Member
 
L'Avatar di vlacus
 
Iscritto dal: May 2003
Messaggi: 118
si ma sotto c'è una "precomputazione" bella tosta ...
__________________
forum che tratta di calcolatrici grafiche in genere: consigli e aiuti www.helpcalculator.tk
vlacus è offline   Rispondi citando il messaggio o parte di esso
Old 08-12-2005, 15:41   #19
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da vlacus
si ma sotto c'è una "precomputazione" bella tosta ...
Anche il programma di FedeX_65246X ha una precomputazione bella tosta (circa 40000000 di mosse) per poi dare la soluzione al primo colpo
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 12:46   #20
wisher
Senior Member
 
L'Avatar di wisher
 
Iscritto dal: Aug 2005
Messaggi: 2755
dal punto di vista matematico si tratta di risolvere un sistema in 89 incognite, una x ogni casella.
il sistema deve eguagliare ogni linea e ogni riquadro alla somma dei numeri da 1 a 9
__________________
wisher è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Sony Xperia 1 VII: lo smartphone per gli appassionati di fotografia Recensione Sony Xperia 1 VII: lo smartphone per ...
Attenti a Poco F7: può essere il best buy del 2025. Recensione Attenti a Poco F7: può essere il best buy...
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
L'amministrazione Trump vorrebbe distrug...
La NASA vorrebbe realizzare un reattore ...
Oltre 1.700 km con una ricarica: l'assur...
Maxi annuncio dalla Casa Bianca: Apple p...
Microonde con grill, super venduto e app...
Pubblicazioni scientifiche false in aume...
Ecco le 100 startup che prenderanno part...
Pandora colpita da un attacco informatic...
Cooler Master MasterFrame 360 Panorama S...
Motorola e Swarovski lanciano The Brilli...
Wikipedia dichiara guerra all'IA spregiu...
Dai social ai farmaci dimagranti: il nuo...
Addio spam su WhatsApp? Ecco le nuove di...
Su Windows 11 25H2 cambierà (in p...
Per la prima volta un portatile gaming c...
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: 02:15.


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