Hallo.
Ich soll ein Programm schreiben, dass das 8 Damen Problem auf einem 8x8 Schachfeld löst.
Ich habe dabei versucht ein Schema, das ich leider nicht mehr finde umzusetzen.
Es basierte jedoch auf 2 Prozeduren und einer Funktion: neueZeile, schiebe und gesetzt.
Ich bekomme jedoch immer einen BufferOverflow und komme nicht mehr weiter - finde auch den Fehler nicht.
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: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| procedure TForm1.neueZeile(i: integer); var x,y: integer; begin for x:=1 to 4 do begin if belegt(i,x)=false then begin Damen[i,x]:=true; if i<4 then neueZeile(i+1) else begin Memo1.Lines.Add(IntToStr(i)+' '+IntToStr(x)); for y:=1 to 4 do begin if Damen[i,y]=true then Damen[i,y]:=false; end; schieben(i-1); end; end else schieben(i-1); end; end;
procedure TForm1.schieben(i: integer); var x: integer; j: boolean; begin j:=false; for x:=1 to 4 do begin if belegt(i,x)=false then begin Damen[i,x]:=true; neueZeile(i+1); j:=true; break; end; end; if (j=false) and (i>1) then schieben(i-1); end;
function TForm1.belegt(z,s: integer):boolean; var k: integer; begin k:=1; result:=false; while z-k>=1 do begin if Damen[z-k,s]=true then result:=true; if (s-k>1) and (Damen[z-k,s-k]=true) then result:=true; if (s+k<4) and (Damen[z-k,s-k]=true) then result:=true; inc(k); end; end;
procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; neueZeile(1); end; |
Vllt sieht ja einer von euch woran es liegt.
Danke Markus