Forum » Programiranje » [C++] Iskanje v globino
[C++] Iskanje v globino
minghags ::
Lep pozdrav!
Imam funkcijo za iskanje v širino ampak moram pa še narediti iskanje v globino. Ker mi koncept ni točno jasen, bi mi lahko mogoče kdo pomagal?
Koda:
Imam funkcijo za iskanje v širino ampak moram pa še narediti iskanje v globino. Ker mi koncept ni točno jasen, bi mi lahko mogoče kdo pomagal?
Koda:
void iskanjeVSirino(int* matrika, int* barva, int* razdalja, int* predhodnik, int velikost, int s) { queue<int> Q; for(int i=0; i<velikost; i++) { barva[i] = bela; razdalja[i] = inf; predhodnik[i] = nil; } barva[s] = siva; razdalja[s] = 0; Q.push(s); while(Q.empty() == false) { int v = Q.front(); Q.pop(); int ePrvi = v*velikost; int eZadnji = ePrvi+velikost; for(int e=ePrvi; e<eZadnji; e++) { if(matrika[e] == 1) { int u = e-ePrvi; if(barva[u] == bela) { barva[u] = siva; razdalja[u] = razdalja[v]+1; predhodnik[u] = v; Q.push(u); } } } barva[v] = crna; } }
genesiss ::
Edina razlika med BFS in DFS je, da DFS uporablja sklad (stack) BFS pa vrsto (queue). Naredi eno drevo na roke, boš videl v čem je fora.
Zgodovina sprememb…
- spremenil: genesiss ()
genesiss ::
Sintakso imaš v dokumentaciji: http://www.cplusplus.com/reference/stl/...
S primeri, recimo za pop: http://www.cplusplus.com/reference/stl/...
S primeri, recimo za pop: http://www.cplusplus.com/reference/stl/...
Ciklamen ::
Pozdrav.
Tudi jaz se ubadam s tem iskanjem v globino, do sedaj sem prišel gor s tem:
Verjamem da je koda grda, ampak razbijam si glavo in ne vem kako naj iz BFS v DFS spremenim (ignorirajte komentarje, ti so tam ker je koda iz BFS-a)
Tudi jaz se ubadam s tem iskanjem v globino, do sedaj sem prišel gor s tem:
void IskanjeVSirino(Vozlisce G[], Vozlisce zac, int** sosednji, Vozlisce Q[]) { for(int i=0; i<=velikost; i++) { G[i].ime = i; G[i].status = 0; G[i].dolzina = 100; G[i].predhodnik = -1; } zac.status = 1; zac.dolzina = 0; zac.predhodnik = -1; mystack.push(zac); //Vpisi(Q, *z); while(mystack.empty()!=0) { Vozlisce pregled = mystack.top(); //Vozlisce top = mystack.top(); mystack.pop(); glava++; for(int i=0; i<=velikost; i++) { if(sosednji[pregled.ime][i] == 1) { if(G[i].status==0) { G[i].status=1; G[i].dolzina = pregled.dolzina+1; G[i].predhodnik = pregled.ime; //Vpisi(Q, G[i]); mystack.push(G[i]); } } } pregled.status = 2; } }
Verjamem da je koda grda, ampak razbijam si glavo in ne vem kako naj iz BFS v DFS spremenim (ignorirajte komentarje, ti so tam ker je koda iz BFS-a)
- End of the Post ->
Ciklamen ::
Ignore moj zgornji post:
Namesto stack-a vgrajenega v C++ sem uporabil tabelo, ampak problem je, da program se izvede, ampak ne najde mi pa poti med vozlišči. (vedno izpiše, da ni poti med vozliščema)
void IskanjeVSirino(Vozlisce G[], Vozlisce *zac, int** sosednji, Vozlisce Q[]) { for(int i=0; i<=velikost; i++) { G[i].ime = i; G[i].status = 0; G[i].dolzina = 100; G[i].predhodnik = -1; } (*zac).status = 1; (*zac).dolzina = 0; (*zac).predhodnik = -1; Q[tr_sklad]=(*zac); tr_sklad++; //Vpisi(Q, *z); while(tr_sklad!=0) { Vozlisce pregled = Q[tr_sklad]; Q[tr_sklad].ime=NULL; Q[tr_sklad].dolzina=NULL; Q[tr_sklad].predhodnik=NULL; Q[tr_sklad].status=NULL; tr_sklad--; for(int i=0; i<=velikost; i++) { if(sosednji[pregled.ime][i] == 1) { if(G[i].status==0) { G[i].status=1; G[i].dolzina = pregled.dolzina+1; G[i].predhodnik = pregled.ime; //Vpisi(Q, G[i]); Q[tr_sklad]=G[i]; tr_sklad++; } } } pregled.status = 2; } cout<<"Drevo vozlisc je ustvarjeno."<<endl; } void Izpis(Vozlisce G[], Vozlisce zac, Vozlisce pot, int dolzina, int konec, int zacetek) { if(zac.ime == pot.ime) { cout<<"Dolzina poti od "<<zacetek<<" do "<<konec<<" je "<<dolzina<<endl; cout<<endl; cout<<zac.ime; } else { if(pot.predhodnik == -1) { cout<<"Med vozliscem "<<zacetek<<" in "<<konec<<" ni povezave."<<endl; } else { Izpis(G, zac, G[pot.predhodnik], dolzina, konec, zacetek); cout<<" -- "<<pot.ime; } } }
Namesto stack-a vgrajenega v C++ sem uporabil tabelo, ampak problem je, da program se izvede, ampak ne najde mi pa poti med vozlišči. (vedno izpiše, da ni poti med vozliščema)
- End of the Post ->
Ciklamen ::
A res nihče nima namiga? Res se mi gre za to nalogo da jo naredim do konca, ker se mi nenazadnje gre tudi za letnik. Sam ne vem več kaj naj mrdam, bolj kot gledam kje bi lahko kaj spremenil, manj mi je jasno..
Domnevam da nekje v tem stacku, da ne gre iz stacka ven pobirat.
Če hočete lahko še celo kodo pripišem (če bo lažje za prebrat zadeve?)
Domnevam da nekje v tem stacku, da ne gre iz stacka ven pobirat.
Če hočete lahko še celo kodo pripišem (če bo lažje za prebrat zadeve?)
- End of the Post ->
Spura ::
Iskanje v globino ni sprememba iskanja v sirino, ampak cisto drug algoritem. Napisi z nule. Iskanje v globino je celo lazje, ker je naravno reprezentirano v rekurziji funkcij.
darkkk ::
Res je lažje, ampak če ma že vse ostalo napisano mora samo namesto vrste tja noter podstavit sklad (enako se naložijo rekurzivni klici funkcij)
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [VB.NET] classOddelek: Programiranje | 741 (648) | korenje3 |
» | [JAVA] algoritem za iskanje....{nujno!}Oddelek: Programiranje | 886 (760) | gtramt1 |
» | C - pomočOddelek: Programiranje | 1462 (1202) | Thagirion |
» | [C++] Knapsack - pravokotnikiOddelek: Programiranje | 943 (804) | Gundolf |
» | Programiranje "Šah-a" v JaviOddelek: Programiranje | 4251 (3767) | OwcA |