Einzelnen Beitrag anzeigen

Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Eindeutigkeit eines Sudokus

  Alt 22. Nov 2011, 11:43
Das Prüfen auf Eindeutigkeit nimmt wirklich unheimlich viel Rechenzeit in Anspruch. Ich hab‘ es jetzt so gemacht, daß nur noch eine Quasiprüfung durchgeführt wird.

Delphi-Quellcode:
procedure TForm1.PutFixedPlaces;
var
  Cell, HasValue: TIntegerList;
  I, J, K, N: integer;
  Result: boolean;
begin
  Cell:= TIntegerList.Create;
  HasValue:= TIntegerList.Create;
  try
    repeat
      Cell.FillUp(81, 0, 1);
      Cell.Mix;
      N:= 81-(22-(10-FLevel))*3; // (1..9), (18 42 3)
      FFixedList.Clear;
      for K:= 0 to N-1 do
        FFixedList.Add(Cell.Item[K]);
      // Quasiprüfung auf Eindeutigkeit
      Result:= true;
      HasValue.FillUp(9);
      for I:= 1 to 9 do // Numbers
        for J:= 0 to FFixedList.Count-1 do
        begin
          K:= FFixedList.Item[J]; // Feld
          if I = FSolveList.Item[K] then HasValue.IncItem(I-1);
        end;
      for I:= 0 to 8 do
        if HasValue.Item[I] = 0 then
        begin
          Result:= false;
          Break;
        end;
      if Result then
      begin
        Result:= Result and (MaxCandidateCount <= 6);
        Result:= Result and (MinBoxFixedPlacesCount > 0);
      end;
    until Result;
  finally
    Cell.Free;
    HasValue.Free;
  end;
end;

Geändert von Bjoerk (22. Nov 2011 um 12:50 Uhr) Grund: HasValue
  Mit Zitat antworten Zitat