Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-02-2007, 17:44   #1
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
[C++] Minor cammino (semplice)

Salve a tutti. Il problema è semplice: dobbiamo attraversare un castello 5x5 stanze, ed ogni stanza ha un certo costo di attraversamento. Si parte sempre da quella più sud. La versione è semplice e di prestazioni scarse, senza quindi utilizzare programmazione dinamica e altri artefici.

Codice:
#include <iostream>

using namespace std;

#define INF 1000000

int n=5;
int castle[5][5]={{6,7,4,7,8},{7,6,1,1,4},{3,5,7,8,2},{2,6,7,0,2},{7,3,5,6,1}};


int min(int n1, int n2, int n3)
{
    int tmin=n1;
    if (tmin > n2)
        tmin = n2;
    if (tmin > n3)
        tmin = n3;
    
    return tmin;
}


int minCost(int x, int y)
{
    if (x < 0 || x >= n)
        return INF;
    else if (y == 0)
        return castle[x][y];
    else
        return min(minCost(x-1, y-1), minCost(x, y-1), minCost(x+1, y-1)) + castle[x][y];
}


int main()
{
    int x, y=4;
    
    cout << "x da cui partire (0-4): "; cin >> x;
    
    cout << minCost(x,y);
    system("PAUSE");    
}
Eppure il risultato è sempre sbagliato... Qualcuno mi sa dire perchè? Il codice è esattamente quello trovato su Wikipedia, alla seguente pagina
http://it.wikipedia.org/wiki/Programmazione_dinamica
e non è nulla di trascendentale... dove sbaglio?
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 14:30   #2
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Nessuno? é.è
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 14:46   #3
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
In che senso il risultato è sbagliato?
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 15:19   #4
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Codice:
 | 6 | 7 | 4 | 7 | 8 |
 | 7 | 6 | 1 | 1 | 4 |
 | 3 | 5 | 7 | 8 | 2 |
 | 2 | 6 | 7 | 0 | 2 |
 | 7 | 3 | 5 | 6 | 1 |
Questa è la matrice

Se parto dalla casella centrale (5), è evidente che il percorso più breve è:
5 + 0 + 2 + 1 + 4 = 12
Eppure mi restituisce 11. E la stessa cosa in altri casi
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 15:35   #5
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
Lo provo
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 15:45   #6
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Se provi addirittura a partire dall'ultimo (1) ti da 11, mentre è evidentemente 8...
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 17:59   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quello che hai utilizzato è un algoritmo greedy: in pratica scegli di spostarti sulla casella vicina che ha costo minore, ma non porta ad un cammino ottimale se non in rari casi.
Comunque ad occhio non vedo problemi...provo a guardarlo meglio.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 18:52   #8
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Sicuro? Perchè cmq si richiama ricorsivamente sulle caselle successive, scegliendo quelle da cui parte il cammino più breve, e per farlo ripete la cosa su quelle successive ancora... E' molto inefficiente in termini di tempo, però dovrebbe portare alla soluzione ottimale...
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 18:58   #9
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
E cmq resta il fatto che partendo dalla centrale mi da 11 e non 12, quindi il problema è che è TROPPO ottimale XD
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 19:09   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Mesh89 Guarda i messaggi
Sicuro? Perchè cmq si richiama ricorsivamente sulle caselle successive, scegliendo quelle da cui parte il cammino più breve, e per farlo ripete la cosa su quelle successive ancora... E' molto inefficiente in termini di tempo, però dovrebbe portare alla soluzione ottimale...
Guarda questo:

00054
05432
05432
05432
00600

Partendo da quella centrale in basso il tuo farebbe: 6 + 5 + 0 + 0 + 0
Mentre il cammino minore ha costo nullo..

Questo perché permetti sempre e solo di salire di una riga...quando in teoria il cammino minimo potrebbe passare anche da una cella adiacente lateralmente.

C'è un algoritmo del cammino a costo minimo che si chiama Dijkstra...lo puoi adattare semplicemente al tuo algoritmo. Una implementazione dell'algoritmo si chiama Forward Search e la puoi realizzare staticamente e facilmente con due vettori di strutture da 25 elementi (in teoria si farebbe meglio con una lista, ma in questo modo non dove fare allocazione dinamica).
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 19:45   #11
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Si, conosco Dijsktra... cmq ripeto, questo è solo un adattamento del codice proposto alla pagina, mi servirebbe per arrivare poi a capire il passo successivo, non voglio risolvere il problema in modo ottimale, è chiaro che è una pessima via... Però non da il risultato che dovrebbe! Trovato nulla?
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2007, 22:40   #12
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130

Codice:
#include <iostream>

const int INF = 1000000;
int n = 4;
int castle[5][5] = {{6,7,4,7,8},
                    {7,6,1,1,4},
                    {3,5,7,8,2},
                    {2,6,7,0,2},
                    {7,3,5,6,1}};

int min(int n1, int n2, int n3)
{
    return (n1 < n2) ? ((n1 < n3) ? n1 : n3)
                     : ((n2 < n3) ? n2 : n3);
}

int minCost(int x, int y)
{
        if (x < 0 || x > n)
                return INF;
        if (y == 0)
                return castle[y][x];
        return min(minCost(x-1, y-1),
                   minCost(x, y-1),
                   minCost(x+1, y-1)) + castle[y][x];
}

int main()
{
    int x;

    std::cout << "x da cui partire (0-4): ";
    std::cin >> x;
    std::cout << minCost(x, n) << std::endl;
}
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 12:53   #13
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
? O.o"
Mi hai solo indentato il codice in modo diverso, o sbaglio?
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 13:14   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ti ha messo anche questo: if (x < 0 || x > n)
Però sinceramente non mi torna...perchè con x==5 questo fa la chiamata ricorsiva, ma accede a castle[y][5] che è fuori dallo spazio allocato.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 14:09   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ah...ha portato n a 4
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 14:14   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Mesh89 Guarda i messaggi
Codice:
 | 6 | 7 | 4 | 7 | 8 |
 | 7 | 6 | 1 | 1 | 4 |
 | 3 | 5 | 7 | 8 | 2 |
 | 2 | 6 | 7 | 0 | 2 |
 | 7 | 3 | 5 | 6 | 1 |
Questa è la matrice

Se parto dalla casella centrale (5), è evidente che il percorso più breve è:
5 + 0 + 2 + 1 + 4 = 12
Eppure mi restituisce 11. E la stessa cosa in altri casi
Boh...a me restituiscono 12 entrambi i programmi !!!
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 18:00   #17
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
A me 11, e partendo da altre caselle da risultati ugualmente sbagliati... Giuro, non vi sto prendendo in giro! Com'è possibile? ?_?
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 18:35   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
No mi torna 11, non mi aveva ricompilato
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 22:27   #19
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
[jcd@server tmp]$ ./camminomin
x da cui partire (0-4): 2
12
[jcd@server tmp]$ ./camminomin
x da cui partire (0-4): 4
8
[jcd@server tmp]$
Aguzzate la vista!
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 17-02-2007, 23:02   #20
Mesh89
Member
 
Iscritto dal: Dec 2006
Messaggi: 198
Perchè a certi torna 11 ad altri 12?
Mesh89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


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...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
Il cofondatore di Netflix ha lasciato l'...
ASUS porta in Italia il nuovo Zenbook Du...
Assassin's Creed: Black Flag Resynced, s...
Xbox Game Pass cambierà: tra le n...
I nuovi Surface Pro e Laptop sono vicini...
OnePlus ci riprova con la fascia bassa: ...
La Top 10 delle offerte Amazon del weeke...
XGIMI MoGo 2 Pro a 339€: Google TV con N...
Forum IT & Intelligence 2026: dall'A...
iPhone 16e per la prima volta a meno di ...
Stop Killing Games: Ross Scott convince ...
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: 21:53.


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