Einzelnen Beitrag anzeigen

Melvyn

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

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

  Alt 11. Mai 2009, 19: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