Torna indietro   Hardware Upgrade Forum > Software > Programmazione

realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione
realme C100x scommette tutto, forse troppo, sulla batteria da 7500 mAh e sulla certificazione ArmorShell per farsi notare nella fascia più economica del mercato: lo abbiamo messo alla prova per capire a chi è rivolto questo smartphone che sacrifica un po' prestazioni, display e fotocamera per offrire l'autonomia migliore possibile a un prezzo decisamente contenuto
Star Wars Zero Company è l'erede di XCOM 2
Star Wars Zero Company è l'erede di XCOM 2
Bit Reactor porta nell’universo di Star Wars una struttura tattica che richiama apertamente XCOM 2, ma la arricchisce con legami tra i personaggi, progressione ruolistica, gestione della base e un sistema di combattimento costruito attorno a tre Punti Azione e alle risorse condivise della squadra
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
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


realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
NetApp Novus, 100 TB al secondo per sfru...
Spotify giù da ore: se non trovi una can...
Sky con Netflix incluso da 16,99€/mese: ...
Anthropic verso la Borsa: 42 miliardi di...
Data repatriation: cos'è e come S...
ProsperoEden: l'emulatore funzionante ch...
La sonda spaziale ESA JUICE ha effettuat...
iPhone, crash a valanga su migliaia di a...
Se mangi queste patatine puoi vincere un...
Opera browser ha una eSIM integrata da 3...
WINDTRE BUSINESS e la Protezione Civile ...
Intel prepara i chip che si illuminano? ...
HUAWEI WATCH D3 arriva in Italia: l'orol...
PS5 Pro, in Giappone si compra per estra...
Recensione Nothing Headphone (1) Pro, de...
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: 20:19.


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