Treba mi pomoc oko Delphi-ja....

  • Začetnik teme zenski abraksas
  • Datum pokretanja
Z

zenski abraksas

Gost
Cao...Ja sam Jovana...Zanima me da li neko moze da mi pomogne da resim sledeci zadatak...Inace ,cetvrta sam godina jedne Bg gimnazije....
"Napraviti Delphi projekat koji omogucava brz unos mape u kojoj celije string grida u kojima se nalazi tacka predstavljaju kopno a blanko znak more.Potom klik na bilo koje polje treba da izracuna povrsinu kopna na kojoj se celija nalazi.Povrsina predstavlja broj tacaka vezanih u cetiri pravca(Ne dijagonalno)"
 
Opisno : (uz ogradu da ne mogu da ti napishem kood, tanak sam ja sa Delphiem)

- Crtanje po gridu je jednostavna stvar - pogledaj TDrawGrid i help za ovu komponentu.

- Ispitivanje povrshine - Rekurzija ti ne gine, odnosno stari, dobri fill-algorithm ;)
U osnovi, kada utvrdish da pochetno polje pripada "kopnu", onda u rekurzivnoj funkciji proveravash redom gore,dole,levo,desno i za svako polje, ako je kopno, ponovo pozivash rekurziju (naravno, u rekurziji sabirash povrshinu)
 
Rekurzija za to ti je prilicno laka i s' obzirom da nece mnogo opteretiti heap, stvarno se ne isplati pisati glomazni iteraktivni kod za ovaj problem.

recimo da imas deklaraciju

const maxn=100; //ili koliko ti je vec potrebno
var karta: array[1..maxn, 1..maxn] of Boolean;
var maxX, maxY: integer; //koliko ima redova tj. kolona

{ovde dodje kod koji u karta[i,j] upisuje true ako je odgovarajuce polje string grida zemlja a false ako nije}

procedure obidji(x, y: integer;var count: integer);
begin
inc(count);
karta[x,y]:=false;

if (x>1)and(karta[x-1,y]) then obidji(x-1, y, count);
if (x<maxX)and(karta[x+1,y]) then obidji(x-1, y, count);
if (y>1)and(karta[x,y-1]) then obidji(x, y-1, count);
if (y<maxY)and(karta[x,y+1]) then obidji(x-1, y, count);
end;

BTW: Ovo sam ti napisao prilicno na brzaka -- moguce je da ne radi. Jos jedna stvar - nisam radio direkto sa TStringGrid jer bi duze pisai - ti mozes da radis direktno sa nijm ako ti je lakse.

Primeti da ako ispitujes jednu koordinatu na nekoj povrsini ne mozes da ispitujes drugu na istoj povrsini dok ponovo ne ucitas iz grida u matricu, jer procedura "brise kopno" da ne bi duplirala neka polja. Bolju stvar mozes da uradis ako koristis maticu tipa integer umesto Boolean. Recimo 0 za more, 1 za kopno 2 za obidjeno kopno. Menjas 1 u 2 dok obilazis, a kada se vratis sa obidjenog polja vratis 2 u 1.

Dakle, moze i brze i bolje, ali sam se kasno setio ovoga sa integerom...

Probaj da li radi. Ako nesto nije kako treba, javi da ispravimo.....

A u kojoj se to gimnaziji radi Delphi? Da se slucajno ne spremas za takmicenje?
 
Ispravka : TStringGrid, ne TDrawGrid, nisam pazhljivo chitao :)

Inache, ako je ovo za neko takmichenje, ili, jednostavno, ako je mapa veeelika, a brzina bitna, rekurzija i nije najbolja ideja.
Chisto informativno, pogledaj kako radi A* (A Star) algoritam koji je kao stvoren za ovakve probleme, a ne koristi rekurziju i ubedljivo je najbrzhi.

Hint : ako se nakanish pa prouchish A*, za zamenu fill-algoritma se heuristika izbacuje iz A* algoritma.

PS
Savladash to, i vec si na pola puta do Pathfinder-a, odnosno reshenja problema najkraceg/najoptimalnijeg puta u grafu ;)

OK, I'll shut up now :)
 
sto bre zbunjujes ljude grafovima :) to je skolski primer, na takmicenjima su dosta tezi zadaci, tako da brzina nije impreativ, a i kako da bude kad se unosi preko string grida -> treba ti dva sata za veci test primer :) ne kaze se iz datoteke. elem, evo koda:
napravi StringGrid1

i u eventu OnSelectCell za njega upisi

ShowMessage(IntToStr(P(StringGrid1, ARow, ACol));

prethodno definisi funkciju P na sledeci nacin:

function P(var Grid: TStringGrid; i, j: Integer): Integer;
begin
Result := 1;
if (i < Grid.RowCount) and (Grid.Cells[j, i + 1] = '.') then
Result := Result + P (Grid, i + 1, j);
if (i > 0) and (Grid.Cells[j, i - 1] = '.') then
Result := Result + P (Grid, i - 1, j)
if (j < Grid.ColCount) and (Grid.Cells[j + 1,] = '.') then
Result := Result + P (Grid, i, j + 1);
if (j < 0) and (Grid.Cells[j - 1, i] = '.') then
Result := Result + P (Grid, i, j - 1);
end;

uzgred, ovo kucam iz glave, tako da mozda (i verovatno) nece da prodje iz prve, ali eto ti ideje, pa je doradi :) ali ako radi, trebalo bi da ti izadje message box u kome pise povrsina kad pritisnes na neku celiju u StringGridu.

pozdravi
 
Lord British:
Rekurzija za to ti je prilicno laka i s' obzirom da nece mnogo opteretiti heap

RiSK, da l' da te prozivamo malo za ovo gore, shto dezinformishesh mlade nade? ;)
Aj' necemo sad, drugi put.. :)

Dobro, de, stack nije heap. Vidis da sam stvar pisao za minut...

Zeznuo sam se i u proceduri count mora da bude globalna promenjljiva promenljiva, i da se pre poziva ionicijalizuje na nulu. Ono sigurno nece da radi :oops:

A, sto mislis da rekurzija nije dovoljno dobra? Sasvim ce OK da odradi pos'o...
 
E ljudi,hvala vam,ali ja ne idem ni na kakvo takmicenje......Inace,u "sv.Savi"(gimnaziji) sam,i profesor nam je zadao da napravimo ovaj projekat..ali,nazalost,ipak ce morati da se da neki kes za privatnog profesora....hvala...:)
 
lele, ti nisi ni umela da isprobas ono sto treba da predas. pa svaka ti cast.
klikni na neko polje tabele i unesi tacku svugde gde hoces kopno. kad zavrsis klikni na dugme za kraj unosa. posle klikni na neko polje opet i on ce da ti pokaze dal je voda il kopno i koju povrsinu zauzima. a bre na srpski sam napisao tamo uputstva...il bese kineski :)

a za ovo drugo - glupo ti je pitanje, to je isto kao kad se neko zainteresuje da bude zubar, djubrar, bem li ga ja sta drugo. programiranje je jedna vrlo konkretna stvar (kao i ja), nema tu mlacenja prazne slame, sve ti je binarne prirode - radi...il ne radi :) i jednostavno, treba da se rodis s tim.
ko sto reko, begaj sto dalje od delphi :) neces se leba najesti od programiranja
 
Ma ne smarash, mislio sam da je po ko zna koji put neki padobranac upao na foru "kako bre... s'poshtovanjem - Gost"
Uloguj se sledeci put :)

Inache, ne verujem da je ikog zainteresovalo samo programiranje. To ti je doooosadna nauka ako nishta interesantno na ekranu nema za videti.
Eto, ja sam krenuo josh od starih Komodora (ti se verovatno nisi ni rodila u to vreme) jer me je zanimalo kako se oni brodici u igricama crtaju po ekranu. Malo po malo... i eto sada znam ;)
 

Back
Top