![]() |
Delphi-Version: 2010
Sudoku Kandidaten löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Hey,
glaube ich hab eine sehr schwierige Frage. An sich ist das bestimmt nicht so kompliziert, aber ich hab mir mal wieder was komisches ausgedacht :lol: Nun, erstmal beschreibe ich mein Programm: Insgesamt soll ist ein Sudoku Solver werden. Das Sudoku wird in ein Array 0..8 of Array (integer) 0..8 eingetragen. Alle leeren Felder werden dann mit einer 0 gefüllt. Dann werden alle leeren Felder (Felder mit 0) mit Kandidaten gefüllt, sprich bekommen den Wert 123456789. So weit so gut. Dann werden aus den Kandidaten alle festen Werte gelöscht. Dies gelingt mir auch mit den Werten einer Spalte und einer Reihe, jedoch nicht mit denen in einem Feld. Leider ist der Code für die Spalte und Reihe schon sehr kompliziert. Dann habe ich mich an den Code für die Felder herangewagt, aber scheite immer wieder, mein letzter Versuch sieht folgendermaßen aus: Es muss ein Denkfehler von mir sein...
Delphi-Quellcode:
Procedure TForm2.BtKndDeleteClick(Sender: TObject);
Var x, y, a, b, m, n, xx, yy: integer; s, ss: String; Begin m := 0; n := 0; a := 0; b := 0; // Feld mit mehrern Kandidaten suchen Repeat Repeat If aSudoku[m, n] > 9 Then Begin a := m; b := n; x := m; // Zeile nach Werten durchsuchen und aus Kandidatenliste löschen For y := 0 To 8 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; y := n; // Spalte nach Werten durchsuchen und aus Kandidatenliste löschen For x := 0 To 8 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; //Feld nach Werten durchsuchen und aus Kandidatenliste löschen For xx := 0 To 2 Do For yy := 0 To 2 Do Begin For x := xx * 3 To xx * 3 + 2 Do For y := yy * 3 To yy * 3 + 2 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; End; n := n + 1; Until n > 8; n := 0; m := m + 1; Until m > 8; End; |
AW: Sudoku Kandidaten löschen
Zitat:
|
AW: Sudoku Kandidaten löschen
Liste der Anhänge anzeigen (Anzahl: 1)
was ich bei
Delphi-Quellcode:
Falsch mache.
//Feld nach Werten durchsuchen und aus Kandidatenliste löschen
For xx := 0 To 2 Do For yy := 0 To 2 Do Begin For x := xx * 3 To xx * 3 + 2 Do For y := yy * 3 To yy * 3 + 2 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; Weil dies leider nicht funktioniert :( |
AW: Sudoku Kandidaten löschen
hab mein Fehler endeckt:
Hier die Lösung:
Delphi-Quellcode:
// Feld 1 nach Werten durchsuchen und aus Kandidatenliste löschen
If (a < 3) And (b < 3) Then Begin For x := 0 To 2 Do For y := 0 To 2 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 2 nach Werten durchsuchen und aus Kandidatenliste löschen If (a < 3) And (b > 3) And (b < 6) Then Begin For x := 0 To 2 Do For y := 3 To 5 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 3 nach Werten durchsuchen und aus Kandidatenliste löschen If (a < 3) And (b > 5) Then Begin For x := 0 To 2 Do For y := 6 To 8 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 4 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 2) And (a < 6) And (b < 3) Then Begin For x := 3 To 5 Do For y := 0 To 2 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 5 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 2) And (a < 6) And (b > 3) And (b < 6) Then Begin For x := 3 To 5 Do For y := 3 To 5 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 6 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 2) And (a < 6) And (b > 5) Then Begin For x := 3 To 5 Do For y := 6 To 8 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 7 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 5) And (b < 3) Then Begin For x := 6 To 8 Do For y := 0 To 2 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 8 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 5) And (b > 2) And (b < 6) Then Begin For x := 6 To 8 Do For y := 3 To 5 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; // Feld 9 nach Werten durchsuchen und aus Kandidatenliste löschen If (a > 5) And (b > 5) Then Begin For x := 6 To 8 Do For y := 6 To 8 Do If aSudoku[x, y] < 10 Then Begin s := IntToStr(aSudoku[a, b]); ss := IntToStr(aSudoku[x, y]); s := Stringreplace(s, ss, '', [rfReplaceAll]); aSudoku[a, b] := StrToInt(s); End; End; |
AW: Sudoku Kandidaten löschen
Wenn Du uns einmal genau erklärst, was Du mit "Kandidaten" meinst, bekommt man vielleicht noch eine unkompliziertere Lösung hin.
|
AW: Sudoku Kandidaten löschen
So bald man Strg+C drückt, aber spätestens wenn man Strg+V drückt beim Programmieren, sollte einem klar werden, dass man da noch optimieren kann. Mach eine Methode der Klassse daraus und übergib die veränderlichen Werte als Parameter.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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