Autor Beitrag
Dee-M-Cee
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Do 16.03.06 16:07 
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.
ausblenden volle Höhe Delphi-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:
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
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 18.03.06 14:08 
Erstmal optimieren und formatieren:
ausblenden volle Höhe Delphi-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:
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:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
procedure TForm1.neueZeile(I: Integer);
var
  X, Y: Integer;
begin
  for X := 1 to 4 do
  begin
    if not belegt(I, X) 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
          if Damen[I, Y] then
            Damen[I, Y] := False;

        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 not belegt(I, X) then
    begin
      Damen[I, X] := True;
      J           := True;
      
      neueZeile(I + 1);
      
      Break;
    end;
  end;

  if (not J) 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
    Result := Damen[Z - K, S];
    Result := (S - K > 1) AND (Damen[Z - K, S - K]);
    Result := (S + K < 4) AND (Damen[Z - K, S - K]);

    Inc(K);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  neueZeile(1);
end;

Und nun können wir das durchgehen:
ausblenden Quelltext
1:
2:
3:
neueZeile(1);
X = 1:
  Belegt(1, 1) -> ...

Am besten nimmst du dir einen Stift und Papier und gehst mal alles durch. Du solltest außerdem alle Elemente von Damen auf True oder False setzten.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)