Delphi-Quellcode:
Procedure Next(var cnt: integer; x,y: integer; stop: integer);
begin
if stop then exit;
pixel[x,y].color:=clmaroon; // Gezähltes Pixel wird markiert
if Pixel[x+1,y+1]=clblack then // ein Nachbar wird überprüft
begin
inc(cnt);
next(cnt,x+1,y+1, stop);
end;
if Pixel[x,y+1]=clblack then
...
if ..
if ..
if cnt>100 then // Fertig.
begin
Myfloodfill(x,y);
stop:= true; // alle anderen Ableger der Funktion sterben
end;
end;
Procedure Myfloodfill(x,y); // sollte klar sein.
begin
pixel[x,y].color:= :=clnone;
if Pixel[x+1,y].color:=clmaroon then myfloodfill[x+1,y];
if ..
if ..
if ..
end;
Die Idee sollte klar sein. Du suchst nach einem schwarzen Pixel und rufst die Suchfunktion rekursiv für die schwarzen Nachbarn auf. Ein Gefundenes Feld wird Rot angemalt, damit es nicht nochmal gezählt wird, sonst verwickeln schon zwei benachbarte schwarze die Funktion in eine Endlosschleife. Jede neu erzeugte Suchfunktion meldet ihre Treffer an einen Zähler und sobald irgendwo das hunderste Feld gefunden wurde, wird die Suche abgebrochen und die Felder angemalt. Bei meiner Methode brauchst du dir nicht zu merken, welche Felder du durchlaufen hast, weil du den Weg einfach rekonstruieren kannst.
Bis auf Feinheiten, sollte das so funktionieren und wäre dann deutlich einfacher als dein Code. Obs schneller ist, weiss ich nicht, aber das sollte rauszufinden sein.
Erwarte das Beste und bereite dich auf das Schlimmste vor.