Das 8 Damenproblem

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
zain2
Beiträge: 10
Registriert: Mo 5. Nov 2012, 10:26
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Das 8 Damenproblem

Beitrag von zain2 »

Was hab ich falsch gemacht?
Als Thema haben wir Backtraking. Ich habe jetzt 3 Schleifen, die erste probiert alle Felder in der n-ten Zeile durch, die zweite alle Felder in der m-ten Spalte und der zweite probiert dann diagonal alles aus. Nun hängt sich das Programm leider immer auf wenn ich es starte. Der Fehler ist das er zu weit geht mit den Feldern.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var m,n,s,i,l,a:integer;
 
begin
  Randomize;
  m:=0;
  n:=0;
  s:=0;
  i:=0;
  l:=0;
 
  for n:=0 to 7 do
  begin
    if Stringgrid1.Cells[m,n]= 'D' then
       s:=s+1
    else
      for m:=0 to 7 do
      begin
        if Stringgrid1.Cells[m,n]= 'D' then
           i:=i+1
        else
          For i:=0 to 7 do
          begin
            if Stringgrid1.Cells[m+i,n+i]= 'D' then
               s:=s+1
            else
                begin
                     Damesetzten(s,i);
                     l:=l+1;
                     Label1.Caption:=Inttostr(l);
                     end;
          end;
      end;
  end;
 
 
end;
 
procedure TForm1.Damesetzten(n, m: integer);
begin
   Stringgrid1.Cells[m,n]:= 'D';
end;
 
end.
Die Welt geht am 31. Dezember 2099 unter, da endet der Windows Kalender...

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Das 8 Damenproblem

Beitrag von corpsman »

Die Stringgrid Cells gehen auch von 0 bis 7

Deine s und i werden gigantisch groß
s hat am schluß den wert 7^3 = 343 und i müsste 49 haben.

Dein Ansatz ist meines erachtens komplett unsinnig.

Du must doch auf jedes Feld eine Dame setzen, das darfst du aber nur, wenn sie nicht schon geschlagen werden kann, wo prüfst du diese Bedingung ab ?

Um jedoch die Antwort auf deine Frage zu geben, der unten stehende Code verhindert dass du auf nicht existierende Zellen zugreifst ( vorrausgesetzt du siehst 8x8 Felder in deinem Stringgrid).

Code: Alles auswählen

 
procedure TForm1.Damesetzten(n, m: integer);
begin
if (m >= 0) and (m < 8) and (n >= 0) and (n < 8) then 
   Stringgrid1.Cells[m,n]:= 'D';
end;
 
--
Just try it

Antworten