Autor Beitrag
CyTe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 18.04.03 20:36 
Geg.: 2-dimensionalen array, in dem jeder punkt einen der werte 0, 1, 2 oder 3 trägt

Ges.: wie lösche ich alle waagrecht oder senkrecht (nicht diagonal) an einen bestimmten punkt angrenzenden GLEICHEN punkte? auch punkte die an die gelöschten punkte angrenzen, sollen bei bedarf gelöscht werden.
Sunreader
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 18.04.03 21:35 
Hört sich auf jeden fall nach rekursiver programmierung an (hoffe, dass das das :roll: richtige wort ist)
So viel Erfahrung hab ich allerdings nicht damit...
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 18.04.03 22:27 
Hoodi...

was verstehst du unter löschen? Wenn du wild einträge löscht, dann sind sind die dimensionen deines arrays nicht mehr intakt! -> weiss nicht ob du dass willst?

@rekursiv: nette idee...is aber nicht nötig. Einfach zwei for-schleifen für x und y ...dann immer [x+1,y] und [x,y+1] auf gleichheit mit [x,y] prüfen. dann löschen oder was immer :wink:

_________________
mfg.
mâximôv
Sunreader
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 19.04.03 12:51 
Aber ich denke die rekursion ist deshalb nötig, weil ja wenn ein gleicher Nachbar gefunden wurde überprüft werden soll ob davon wiederum ein Nachbar gleich ist, usw, usf...

Zitat:
auch punkte die an die gelöschten punkte angrenzen, sollen bei bedarf gelöscht werden.
Sunreader
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 19.04.03 13:09 
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
var
feld : array [1..100,1..100] of byte;
aktfeldx, aktfeldy: word;


function pruefe([x,y): boolean;





//main-procedure
if pruefe(aktfeldx,aktfeldy) = true then
  feld[aktfeldx,aktfeldy] := 0;



function pruefe(x,y) :boolean;
begin
  if feld[x,y] = feld[aktfeldx,aktfeldy] then begin

    if pruefe(x+1,y) = true then   
      feld[x+1,y]:= 0;

    if pruefe(x-1,y) = true then 
      feld[x-1,y]:= 0;

    if pruefe(x,y+1) = true then 
      feld[x,y+1]:= 0;

    if pruefe(x,y-1) = true then 
      feld[x,y-1]:= 0;
    
    pruefe := true
  end;
end;


Geht das so in etwa @experten?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Sa 19.04.03 13:35 
Wenn das so ist...dann könntest du recht haben :oops: Dein code bedarf aber noch ein paar änderungen...bevor er workt: :roll:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
var 
feld : array [1..100,1..100] of byte; 
aktfeldx, aktfeldy: word; 


procedure pruefung; 
var x,y:integer;
begin //main-procedure 
   for x := 0 to length(...)-1 do
     for y := 0 to length(...)-1 do pruefe(x,y);     
end;


procedure pruefe(x,y); 
begin 
  if (x < length(..)-1) and (y < length(..)-1) then
  begin
    if feld[x,y] = feld[x+1,y] then 
    begin 
       pruefe(x+1,y);     
       feld[x+1,y] := 0;
    end;
    if feld[x,y] = feld[x,y+1] then 
    begin 
       pruefe(x,y+1);     
       feld[x+1,y] := 0;
    end;
  end;
   if (x > 0) and (y > 0) then
  begin
     // hier den ganzen spass für xy-1
  end;
end;
WICHTIG: man sollte darauf achten, dass der stack nicht überläuft...da sich die rekursion hier sehr schnell im kreis drehen kann! ggf. nur für xy+1 laufen lassen. Oder ein zweites array anlegen, dann braucht man aber auch keine rekursion 8)

_________________
mfg.
mâximôv
Sunreader
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 19.04.03 14:57 
8)