Thema: Delphi Backtracking Problem?

Einzelnen Beitrag anzeigen

razer

Registriert seit: 16. Nov 2004
1 Beiträge
 
#8

Re: Backtracking Problem?

  Alt 19. Nov 2004, 13:58
Hallo zusammen,

hab mal probiert das Programm ein wenig zu ordnen und unnötiges rauszuschmeißen.
Das Programm sieht bei mir jetzt folgendermaßen aus:

Delphi-Quellcode:
var
  Form1: TForm1;
  spalte:integer;
  zeile:integer;
  bedrohung:boolean;
  brett:array[1..8,1..8]of boolean;
  ergebnis:array[1..8]of integer;
  n:integer;

implementation

{$R *.DFM}

procedure TForm1.bedroht(Zeile,Spalte:integer; var bedrohung:boolean);
var k:integer;
begin

  k:=1;
  bedrohung:=false;
    while ((Zeile-k)>0) do
      begin
        if Brett[Zeile-k,Spalte]=true then //überprüft Spalte
          begin
            bedrohung:=true;
          end;
        if ((Spalte-k)>0) and (Brett[Zeile-k,Spalte-k]=true) then //überprüft X Daigonale
          begin
            bedrohung:=true;
          end;
        if ((Spalte+k)<(n+1)) and (Brett[Zeile-k,Spalte+k]=true) then //überprüft Y Diagonale
          begin
            bedrohung:=true;
          end;
        k:=k+1;
      end;

end;

procedure TForm1.neueZeile(zeile:integer);
var y:integer;
begin

  spalte:=0;
  repeat
    spalte:=spalte+1;
    bedroht(zeile,spalte,bedrohung);
    if (spalte=n) and (bedrohung=true) then
    schiebe(zeile-1);
  until bedrohung=false;

  Brett[zeile,spalte]:=true;
  Ergebnis[zeile]:=spalte;

  if zeile<n then
    neueZeile(zeile+1)
  else
    for y:=1 to n do
    listbox1.Items.add(inttostr(ergebnis[y]));


end;

procedure TForm1.schiebe(zeile:integer);
var hilf,z:integer;
begin

  hilf:=0;

   for z:=1 to n do
     begin
       if brett[zeile,z]=true then
         begin
         brett[zeile,z]:=false;
         hilf:=z;
         end;
     end;

  spalte:=hilf;

  repeat
    if spalte<n then
    spalte:=spalte+1
      else
    schiebe(zeile-1);
      bedroht(zeile,spalte,bedrohung);
      if (spalte=strtoint(edit1.text)) and (bedrohung=true) then
      begin
        if zeile>1 then
        schiebe(zeile-1)
          else
        exit;
      end;
  until bedrohung=false;


  brett[zeile,spalte]:=true;
  ergebnis[zeile]:=spalte;

  
  neueZeile(zeile+1); //<------


end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  listbox1.clear;
  n:=strtoint(edit1.text);

  if (n=2) or (n=3) then
    begin
    showmessage('Für diesen Parameter gibt es keine Lösung');
    n:=0;
    end;

  for i:=1 to n do
    begin
    brett[i,i]:=false;
    end;

  neueZeile(1);

end;
Wenn man die Zeile mit dem Pfeil (<-----) rauslässt, kommt kein stackoverflow mehr, allerdings kommen falsche werte raus.
Leider komme ich an dieser Stelle auch nicht weiter. Ihr könnt ja nochmal drüberschauen.
Bis dann
  Mit Zitat antworten Zitat