![]() |
Eindeutigkeit eines Sudokus
Delphi-Quellcode:
Ich gehe so vor, daß für alle nicht gesetzten Felder eine Kandidatenliste erstellt wird und anschließend soll TestSudoku nun feststellen, ob das Sudoku so eindeutig (lösbar) ist. Kann man abschätzen, ab welcher Kandidatenanzahl (nach Ausdünnung der Doppel) ein Sudoku eindeutig ist oder wie macht man das ? :spin2:
function TForm1.TestSudoku: boolean;
var N, M, K, I, J, J1, K1: integer; T: TPoint; begin // Ausdünnung // 1. Doppelte Kandidaten entfernen Result:= true; for N:= 1 to 9 do // Numbers for I:= 0 to 8 do // Boxes for J:= 0 to 8 do // Indices begin T:= BoxToRowCol(I, J); K:= RowColToIndex(T.X, T.Y); // Edit if FCandidates[K].IndexOf(N) > -1 then for J1:= 0 to 8 do // Indices begin T:= BoxToRowCol(I, J1); K1:= RowColToIndex(T.X, T.Y); // Edit if K <> K1 then begin M:= FCandidates[K1].IndexOf(N); if M > -1 then FCandidates[K1].Del(M); end; end; end; und jetzt ?? wann false (also nicht eindeutig) ???? |
AW: Eindeutigkeit eines Sudokus
Na ja, so wie ich das sehe, kommt das nie FALSE raus..
Du setzt 'Result' nur 1x auf TRUE, sonst nie wieder. "Eindeutig lösbar" wirst Du so eh nicht feststellen. Bloß weil es derzeit für eine Zelle zwei Kandidaten gibt, heißt ja nicht, das es zwei Lösungen für das Sudoku gibt. |
AW: Eindeutigkeit eines Sudokus
Natürlich kann man das so feststellen, muß man sogar, wie denn sonst? Alle verblieben Kandidatenkombinationen einem Sudoku zuführen. Gibt es dabei mehr als eine Lösung, ist es nicht eindeutig. Das ist genau der Teil, der noch fehlt. Da das Rechenzeit in Anspruch nimmt, wäre ein vorherige Abschätzung sinnvoll. Das war die Frage :wink:
|
AW: Eindeutigkeit eines Sudokus
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz