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;