Autor Téma: Zjednodušení funkce  (Přečteno 499 krát)

(T)lama

  • Host
Zjednodušení funkce
« kdy: 24-04-2006, 22:29:59 »
Našel jsem tuto funkci na generování sudoku. Když dám nejtěžší úroveň tak u mě generování trvá cca 3 sekundy. Nejde tato funkce nějak zjednodušit, aby netrvala tak dlouho?

 
Citace
Citovat:
procedure TfrmMain.Gen2;
Var I,Y,X : Integer;
    TryRemove : Integer;
    RemoveX,RemoveY : Integer;
    UsedList : TStringList;
    Redo : Boolean;
    //Poss : TPossibles;
    RemoveCount : Integer;
    Difficulty : TDifficulty;
    tmpDifficulty : TDifficulty;
    FoundOne : Boolean;
    TryValue : String;
    OldValue : Integer;
begin
  panGenerating.Show;
  StatusBar1.Panels[3].Text:=srGenerating;
  application.ProcessMessages;

  Difficulty:=GetDifficulty;

  If Difficulty<=diffVeryEasy then
  begin
    RemoveCount:=VeryEasyRemoveCount-Random(5);
  end
  Else If Difficulty=diffEasy then
  begin
    RemoveCount:=EasyRemoveCount-Random(5);
  end
  Else If Difficulty=diffMedium then
  begin
    RemoveCount:=MediumRemoveCount-Random(5);
  end
  Else If Difficulty=diffHard then
  begin
    RemoveCount:=HardRemoveCount;
  end
  Else If Difficulty=diffVeryHard then
  begin
    RemoveCount:=VeryHardRemoveCount;
  end
  else
  begin
    Raise(Exception.Create(srInvalidDifficulty));
  end;

  Randomize;
  try
    Screen.Cursor:=crHourGlass;
    Repeat
      Redo:=false;
      InitGrid(true);

      For x:=0 to 8 do
      begin
        For y:=0 to 8 do
        begin
          If Not(GeneratePiece(x,y)) then
          begin
            Redo:=true;
            break;
          end;
        end;
        If Redo then break;
      end;
    Until Not(Redo);

    CopyGameGridToTempGrid;

    FoundOne:=false;

    For i:=0 to 8 do
    begin
      RemoveX:=Random(8);
      Grid[RemoveX,i]:=-1;
    end;

    UsedList:=FindUsedCells;
    Shuffle(UsedList);

    Repeat
      TryRemove:=Random(UsedList.Count);
      TryValue:=UsedList[TryRemove];
      RemoveX:=StrToInt(TryValue[1]);
      RemoveY:=StrToInt(TryValue[2]);
      UsedList.Delete(TryRemove);
      OldValue:=Grid[RemoveX,RemoveY];
      Grid[RemoveX,RemoveY]:=-1;
      fTryCount:=0;
      If RecurseSolve(UsedList, TotalCount-UsedList.Count, RemoveCount,Difficulty,tmpDifficulty) then
      begin
        If tmpDifficulty=Difficulty then
        begin
          FoundOne:=true;
        end;
      end;
      If Not(FoundOne) then Grid[RemoveX,RemoveY]:=OldValue;
    Until FoundOne;
    UsedList.Free;

    If Not(FoundOne) then Raise(Exception.Create(srNoGridsError));

    CopyGameGridToOrgGrid;
    CopyTempGridToSolvedGrid;

  finally
    panGenerating.Hide;
    Screen.Cursor:=crDefault;
  end;
end;

MartinCFM

  • Host
Zjednodušení funkce
« Odpověď #1 kdy: 24-04-2006, 23:46:00 »
no pochybuji, ze s timhle nekdo neco provede - chybi tu vsechny funkce, ktere se pri generovani pouzivaji.
Jednodussi bude zkusit na netu najit jiny algoritmus.
Pripadne zkusit tento optimalizovat - napriklad pokusit se zbavit prace se stringama ve smyckach ( StrToInt(TryValue[1]); ), ale nejake vyrazne urychleni to dle meho nazoru stejne neprinese ...

P.S. pro vkladani kodu slouzi tagy (samozdrejme bez tech mezer)
[co de]
[/co de]
... zajimalo by me, proc na ne neni dole nejake tlacitko ???