AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi optimieren einer Prozedur die ein Sudoku lösen kann
Thema durchsuchen
Ansicht
Themen-Optionen

optimieren einer Prozedur die ein Sudoku lösen kann

Ein Thema von Melvyn · begonnen am 11. Mai 2009 · letzter Beitrag vom 12. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#1

optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 17:39
Hallo Leute,

ich bin gerade dabei einen Sudokulöser mit Delphi7 zu schreiben. Er lässt sich bereits starten, aber funktioniert noch nicht obwohl Delphi keinen Fehler anzeigt. Kann mir jemand helfen den Fehler im Quelltext zu suchen?

Danke bereits im Vorraus
Melvyn
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:44
Dazu kann ich nur sagen: viel Glück.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#3

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:47
was meinst du?
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:47
Und wieder einer, der den Sinn eines Internetforums nicht erkannt hat. Hängt hier irgendwo ein Schild?


Btw,

Willkommen

//Edit:
Smiley repariert.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#5

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:53
Ja, ich kenne den Sinn eines Forums. Aber den ganzen Quelltext zu diskutieren hat wenig Sinn...

Aber eine Frage: Kannst du mir helfen?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:56
Zitat von Melvyn:
(Ich verschicke dann Quelltext und Screen per Mail, da ich vor der Fertigstellung des Programms den Quelltext nicht veröffentlichen möchte)
So geht das nicht.
Niemand möchte ein nichtfunktionierendes Sudokuprogramm nach Fehlern durchsuchen und die Kommunikation über EMail führen.
(und auch noch seine EMail-Adresse preisgeben)
Du stellst möglichst konkrete Fragen und bietest dafür so viel Information wie nötig.
Im optimalen Fall lieferst du ein halbfertiges Programm mit Sourcecode und bekommst dafür Tipps und Hilfe.
Hier im Forum entsteht dann ein mehr oder weniger funktionierendes Programm von dem Jeder profitieren und lernen kann.
>> Aber den ganzen Quelltext zu diskutieren hat wenig Sinn
Man kann jedes Problem in Teilprobleme zerlegen und du darfst auch gerne den gesamten Sourcecode (bitte ohne DCU und ~*-Dateien) als Zip-Archiv anhängen.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#7

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:58
Zitat von Melvyn:
Aber eine Frage: Kannst du mir helfen?
Bestimmt. So wie viele andere hier. Stelle den Quelltext rein, warte, bis jemand (oder mehrere) Zeit und Lust gefunden hat, da mal einen Blick drauf zu werfen, und schwuppdiewuppdi ist anderen Neulingen auch geholfen.

Privataudienzen gibts natürlich auch, allerdings nur gegen Gebühr.

Sorry, aber auf die Art und Weise nach Hilfe fragen ist kein guter Start in einem Forum. Erstelle einen neuen Thread unter "Open-Source" mit deinem Programm.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Hilfe gesucht!

  Alt 11. Mai 2009, 17:59
Bei der Gelegenheit könntest Du gleich den ersten Beitrag editieren und einen anderen Titel wählen, der das Problem zumindest im Ansatz beschreibt (Hilfe suchen hier so ziemlich alle )
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#9

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 18:18
Gut dann werd ich mal konkretisieren. Die Lösen-Funktion des Sudokus funktioniert noch nicht. Beim drücken des Buttons zur laufzeit hängt sich das programm dann auf. Im moment sieht diese Prozedur jetzt so aus:

Delphi-Quellcode:
procedure TForm1.BitBtn3Click(Sender: TObject);
var x,y,bes:integer;
    n:string;
    function SIndex(x,y:integer):integer; begin result:= (x+(y*9))+1; end;
begin
 Start();
 for y:=0 to 8 do
  for x:=0 to 8 do
   begin
    bes:=Bestaetigen(StringGrid1.Cells[x,y]);
    if bes>0 then
     begin
      if WertSetzen(SIndex(x,y), bes) then
       begin
        S[SIndex(x,y)].a:=bes;
        S[SIndex(x,y)].b:=false;
       end else
       begin
        MessageBox(self.Handle, 'Falsche Eingabe!','Bitte erneut eingeben', mb_iconerror);
        exit;
       end;
     end else
      if bes<0 then
       begin
        n:='Ungültige Eingabe:' + StringGrid1.Cells[x,y];
        MessageBox(self.Handle, pchar(n), 'Fehler', mb_iconerror);
        exit;
       end;
   end;
 Loesen();
 for y:=0 to 8 do
  for x:=0 to 8 do
   StringGrid1.Cells[x,y]:=IntToStr(S[SIndex(x,y)].a);
end;
die ausgabe hab ich dann noch für mojidoku umegebastelt, aber auch das funktioniert noch nicht
StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)+26); Loesen() ist eine eigenständige Prozedur
Delphi-Quellcode:
procedure Loesen();
var
 c:integer;
begin
 c:=1;
  while c<=81 do
   begin
    if S[c].b then
     begin
      if S[c].a<9 then
       begin
        inc(S[c].a);
        if WertSetzen(c,S[c].a) then
         begin
          inc(c);
         end else
         if S[c].a=9 then
          repeat
           if S[c].b then S[c].a:=0;
           dec(c);
           if S[c].b then WertFreigeben(c,S[c].a);
          until S[c].b
         end else
         begin
          WertFreigeben(c,S[c].a);
          repeat
           if S[c].b then S[c].a:=0;
           dec(c);
           if S[c].b then WertFreigeben(c,S[c].a);
          until S[c].b
         end;
      end else inc(c);
   end;
end;
so ich hoffe ihr könnt mir helfen. ich habe anfangs eine offene schleife vermutet aber keinen anhaltspunkt dafür gefunden.

[edit=mkinzler]Code-Tags durch Delphi-Tags ersetzt Mfg, mkinzler[/edit]
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 18:58
Das sieht für mich aus wie ein Brute-Force Algorithmus.
Dabei sind mal so ganz grob ~ 600 Mio. Lösungsschritte notwendig.
Im englischen Wikipedia wird berichtet, dass diese Lösungsstrategie ca. 30 bis 45 Min benötigt.
http://en.wikipedia.org/wiki/Algorit...y_backtracking
Andreas
  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:02 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