AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Backtracking Problem?

Ein Thema von Thorben86 · begonnen am 15. Nov 2004 · letzter Beitrag vom 16. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
Thorben86

Registriert seit: 20. Nov 2003
Ort: Brühl
365 Beiträge
 
Delphi 2005 Personal
 
#1

Backtracking Problem?

  Alt 15. Nov 2004, 17:00
Hi, ich sitz hier mit nem Programm, über Backtracking (konkret geht es darum, 8 damen auf einem schachbrett zu positionieren, ohne dass diese sich schlagen können.)

Allerdings Ergibt sich jedesmal ein StckOverflow, und die Variable Spalte ist am ende 9 Stellig. Könnte vielleciht einer mal drübergucken und nen tip geben, an welcher stelle der in eine unendliche Rekursion geht?
Angehängte Dateien
Dateityp: rar 8damen.rar (6,5 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#2

Re: Backtracking Problem?

  Alt 15. Nov 2004, 20:53
Ich denke, es würden sich sicher viel mehr anschaun, wenn du es als zip anhängst (zip ist einfach standard...) oder wenn du die Problemstelle herauskristallisieren würdest.
PS: Hast du schon mal nach Damen-Problem gegoogelt. Ist eigentlich ein recht berühmtes rekursives Problem.
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#3

Re: Backtracking Problem?

  Alt 15. Nov 2004, 23:52
das problem mit zip ist halt, dass es mittlerweile echt veraltet ist.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Backtracking Problem?

  Alt 16. Nov 2004, 01:17
das muss aber nicht heissen das jeder unrar in der console bedienen will.
denn nicht jeder hat eine vollversion bzw raubkopie
  Mit Zitat antworten Zitat
Alexander

Registriert seit: 28. Aug 2002
Ort: Oldenburg
3.513 Beiträge
 
Turbo Delphi für .NET
 
#5

Re: Backtracking Problem?

  Alt 16. Nov 2004, 09:59
Zitat von generic:
das muss aber nicht heissen das jeder unrar in der console bedienen will.
denn nicht jeder hat eine vollversion bzw raubkopie
Genau . Hier in der SChule habe ich z.B. gerade nichts tun, kein RAR und keine Installationsrechte .
PS: Sonst benutze ich eigentlich auch eher rar...

Aber das ist jetzt OT
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Backtracking Problem?

  Alt 16. Nov 2004, 10:18
Hab nicht genug Zeit nach dem Fehler zu schauen aber falls es Dir hilft:
Hier ist meine Version! Is schon lange her und wahrscheinlich nicht so sauber geproggt aber dafür kann man die Lösungen auch manuell suchen... Für die Leute die sich mal anstrengen wollen...
Quelltext liegt mit bei... Und is auch RAR
Angehängte Dateien
Dateityp: rar schach.rar (133,0 KB, 30x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Thorben86

Registriert seit: 20. Nov 2003
Ort: Brühl
365 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Backtracking Problem?

  Alt 17. Nov 2004, 00:37
Sry, hab gar nicht gemerkt, dass ich es als rar hatte, is standarteinstellung bei mir. Ich hänge es nochmal als Zip an.

Das mit dem Problem hab ich doch zum Teil schon im ersten post geschrieben, dass der irgendwo eine falsche abbruchbedingung hat und dadurch die Variable Spalte wahrscheinlich zu groß wird(9 stellige zahl, obwohl es nur 8 spalten geben dürfte).
Angehängte Dateien
Dateityp: zip 8damen1.zip (166,5 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
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
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Backtracking Problem?

  Alt 16. Dez 2004, 13:56
Zitat von generic:
das muss aber nicht heissen das jeder unrar in der console bedienen will.
denn nicht jeder hat eine vollversion bzw raubkopie
Ich bin nur zufällig hierher gekommen, aber bei so viel Unwissenheit muss ich was schreiben. Man braucht keine Vollversion oder Rabkopie. Über das Kontextmenü kann man WinRAR auch ohne Registrierung ohne Einschränkung nutzen. Nur wenn WinRAR selbst geöffnet wird, bekommt man einen NagScreen.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Timo B.
(Gast)

n/a Beiträge
 
#10

Re: Backtracking Problem?

  Alt 16. Dez 2004, 14:15
[edit] sorry, da hatte ich was falsch verstanden [/edit]
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz