Forum » Programiranje » stetje otokov
stetje otokov
bmozin ::
Prosil bi za pomoc, ce ima kdo idejo, kako sprogramirati to rec (v Mathematici - ni treba kode pisati, prosim samo za idejo).
Imamo matriko pozitivnih stevil (lahko si predstavljamo kot pokrajino).
Treba je izracunati stevilo otokov (nad stevilko x), torej stevilo povezanih celic, ki vsebujejo stevilo vecje od x. (matriko ze prej pretvorimo tako, da je "poplavljena").
Steje se samo gor pa dol, po diagonali ni treba.
Torej, ce je npr. matrika in x = 2,
2 3 5 2
2 4 2 6
2 2 2 2
2 7 2 2
imamo tri otoke (3-4-5, 6, 7).
Ena moznost je, da zacnemo npr. pri (1,1) in gremo desno in dol in ko pridemo do x, pristejemo stevcu 1 itd., ampak tega ne bi znal sprogramirati.
Hvala za pomoc
Imamo matriko pozitivnih stevil (lahko si predstavljamo kot pokrajino).
Treba je izracunati stevilo otokov (nad stevilko x), torej stevilo povezanih celic, ki vsebujejo stevilo vecje od x. (matriko ze prej pretvorimo tako, da je "poplavljena").
Steje se samo gor pa dol, po diagonali ni treba.
Torej, ce je npr. matrika in x = 2,
2 3 5 2
2 4 2 6
2 2 2 2
2 7 2 2
imamo tri otoke (3-4-5, 6, 7).
Ena moznost je, da zacnemo npr. pri (1,1) in gremo desno in dol in ko pridemo do x, pristejemo stevcu 1 itd., ampak tega ne bi znal sprogramirati.
Hvala za pomoc
matjazx ::
povežeš vse elemente večje od x in prešteješ podgrafe
u Mathematici pa nebi vedu kako to implementirat
u Mathematici pa nebi vedu kako to implementirat
JerKoJ ::
Hmm prvo bi pretvoru matriko v binarno
Odstejes visino (npr:2) ostale elemente pretvoris v 1
Pol pa uporabis nekaksen predelan "labeling" algoritem
gres od zgoraj-navzdol, levo -desno, stevec=0:
Ko prides na 1:
ce imas levo 0 in zgoraj 0 potem stevec++ (nov otok)
ce imas levo 1 in zgoraj 0 potem stevec=stevec (stari otok)
ce imas levo 0 in zgoraj 1 potem stevec=stevec (stari otok)
ce imas levo 1 in zgoraj 1 potem stevec-- (zdruzis otoka skupaj)
na koncu matrike, ki moral imet stevilo otokov
pazi na robovih matrike (najbolje je matriko povecati in dati rob povsod 0)
mozno so sevada napake, tako da dobro testiraj
UPDATE: ne dela, ce imas "jezera" znotraj otokov - resitev je uporaba ID otokov (v primeru 1 generiras nov ID, 2,3 - vzames najdeni ID, v primeru 4 si oznacis ekvivalenco IDjev) ali pa na zacetku izvedes flood-algoritem - z 0 oznacis samo "morje" - zacnes na (povecanem!) robu oznacujes dokler je kaksen sosed (tudi po diagonali) enak iskani visini (npr: 2 v tvojem primeru).
Odstejes visino (npr:2) ostale elemente pretvoris v 1
Pol pa uporabis nekaksen predelan "labeling" algoritem
gres od zgoraj-navzdol, levo -desno, stevec=0:
Ko prides na 1:
ce imas levo 0 in zgoraj 0 potem stevec++ (nov otok)
ce imas levo 1 in zgoraj 0 potem stevec=stevec (stari otok)
ce imas levo 0 in zgoraj 1 potem stevec=stevec (stari otok)
ce imas levo 1 in zgoraj 1 potem stevec-- (zdruzis otoka skupaj)
na koncu matrike, ki moral imet stevilo otokov
pazi na robovih matrike (najbolje je matriko povecati in dati rob povsod 0)
mozno so sevada napake, tako da dobro testiraj
UPDATE: ne dela, ce imas "jezera" znotraj otokov - resitev je uporaba ID otokov (v primeru 1 generiras nov ID, 2,3 - vzames najdeni ID, v primeru 4 si oznacis ekvivalenco IDjev) ali pa na zacetku izvedes flood-algoritem - z 0 oznacis samo "morje" - zacnes na (povecanem!) robu oznacujes dokler je kaksen sosed (tudi po diagonali) enak iskani visini (npr: 2 v tvojem primeru).
Zgodovina sprememb…
- spremenil: JerKoJ ()
Seadoo ::
Ideja o binarni matriki je cool. Naprej pa uporabi funkcijo, ki jo ima Mathematica vgrajeno za iskat otoke. Vsaj Matlab vem da jo ima, ker sem jo nekoč rabil. Kako se kliče pa ne vem več. Ampak pomaga že to, da veš da obstaja, samo najt je treba .
Našu: bwlabel link.
Našu: bwlabel link.
Out of my mind. Back in five minutes.
Zgodovina sprememb…
- spremenilo: Seadoo ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Logaritemska enačba - ne dobim pravilne rešitveOddelek: Šola | 2279 (2096) | lebdim |
» | java pomočOddelek: Programiranje | 1982 (1374) | kr?en |
» | programiranje krožek(pomoč)Oddelek: Pomoč in nasveti | 2773 (1761) | Marat |
» | Problem (strani: 1 2 3 4 … 15 16 17 18 )Oddelek: Znanost in tehnologija | 124682 (118086) | Ha'kiv |
» | C# Iskanje besedOddelek: Programiranje | 1785 (1635) | Spura |