Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sudoku Kandidaten löschen (https://www.delphipraxis.net/164387-sudoku-kandidaten-loeschen.html)

Marcel2906 10. Nov 2011 10:00

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;

gammatester 10. Nov 2011 10:05

AW: Sudoku Kandidaten löschen
 
Zitat:

Zitat von Marcel2906 (Beitrag 1135472)
Hey,

glaube ich hab eine sehr schwierige Frage.

Und wie lautet die Frage?

Marcel2906 10. Nov 2011 10:11

AW: Sudoku Kandidaten löschen
 
Liste der Anhänge anzeigen (Anzahl: 1)
was ich bei

Delphi-Quellcode:
  //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;
Falsch mache.
Weil dies leider nicht funktioniert :(

Marcel2906 10. Nov 2011 13:39

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;

DeddyH 10. Nov 2011 13:43

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.

Luckie 10. Nov 2011 13:45

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