Thema: Delphi Array Werte vergleichen

Einzelnen Beitrag anzeigen

Marcel2906

Registriert seit: 17. Aug 2011
Ort: Warendorf
112 Beiträge
 
Delphi 2010 Professional
 
#1

Array Werte vergleichen

  Alt 15. Nov 2011, 13:35
Delphi-Version: 2010
Ich versuch jetzt schon seit 3 stunden meine Fehler zu finden, doch leider ohne erfolg.
Ausgangsposition ist ein Array 0..8 von Array 0..8 (ein Sudoku Feld).

Nun bin ich dabei die Methode des unsichtbaren Einers zu programmieren. Sprich, wenn ein Kandidat (Möglichkeit) nur einmal in einer Reihe, Spalte oder Feld vorkommt, kann dieser fest Eingtragen werden.

Die Prüfung für die Reihe:

Delphi-Quellcode:
   //Reihen nach unsichtbaren Einern durchsuchen
   For x := 0 To 8 Do Begin
      For y := 0 To 8 Do
         If aSudoku[x, y] > 9 Then Begin
            j := 0;
            i := 1;
            a := x;
            b := 0;
            z := IntToStr(aSudoku[x, y]);
            Repeat
               If (pos(z[i], IntToStr(aSudoku[a, b + j])) > 0) Then Begin
                  If (a <> x) Or (b + j <> y) Then Begin
                     i := i + 1;
                     j := 0
                  End Else Begin
                     j := j + 1;
                     If j > 8 Then
                        aSudoku[x, y] := StrToInt(z[i]);
                  End;
               End Else Begin
                  j := j + 1;
                  If j > 8 Then
                     aSudoku[x, y] := StrToInt(z[i]);
               End;
            Until (i > length(z)) Or (j > 8);
         End;
   End;
und für die Spalte:

Delphi-Quellcode:
   //Spalten nach unsichtbaren Einern durchsuchen
   For x := 0 To 8 Do Begin
      For y := 0 To 8 Do

         If aSudoku[x, y] > 9 Then Begin
            j := 0;
            i := 1;
            a := 0;
            b := y;
            z := IntToStr(aSudoku[x, y]);
            Repeat
               If (pos(z[i], IntToStr(aSudoku[a + j, b])) > 0) Then Begin
                  If (a + j <> x) Or (b <> y) Then Begin
                     i := i + 1;
                     j := 0
                  End Else Begin
                     j := j + 1;
                     If j > 8 Then
                        aSudoku[x, y] := StrToInt(z[i]);
                  End;
               End Else Begin
                  j := j + 1;
                  If j > 8 Then
                     aSudoku[x, y] := StrToInt(z[i]);
               End;
            Until (i > length(z)) Or (j > 8);
         End;
   End;
funktionieren Einwandfrei. Doch für das Feld komme ich einfach nicht weiter.
Dazu ein Beispiel (soll ein Sudoku Feld sein):

? 3 0 | 0 0 0 |0 0 0|
0 0 0 | 2 0 0 |0 0 0|
4 5 0 | 0 0 0 |0 0 0|
_____________________
0 0 2 | 0 0 0 |0 0 0|
0 0 0 | 0 0 0 |0 0 0|
0 0 0 | 0 0 0 |0 0 0|
_____________________
0 0 0 | 0 0 0 |0 0 0|
0 0 0 | 0 0 0 |0 0 0|
0 0 0 | 0 0 0 |0 0 0|

Oben links muss ja die 2 rein, da alle anderen Felder gesperrt sind durch die 2 Außen.
Mein Programm schreibt in allen leeren Felder alle Möglichkeiten rein, sprich für das Fragezeichenfeld: 126789 und in den anderen Felder des ersten 3x3 Feldes 16789.
also kommt die 2 nur noch einmal in dem ersten 3x3 feld vor und kann somit eingtragen werden.

Mein Programm sollte dementsprechen soetwas machen:


- Gehe alle Felder 3x3 ab und suche nach Wert größer 9.
- Wenn ein Feld gefunden, dann speichere Wert als string in variable z.
- Dann gehe alle Felder 3x3 ab und prüfe ob eine Position von z in den Werten der Felder enthalten ist
- Wenn ein Wert von z nicht in den anderen Felder vorhanden ist, den Wert in das Feld eintragen.

Mein letzter Ansatz der leider überhaupt nicht macht was es soll:

Delphi-Quellcode:
  For x := 0 To 2 Do Begin
      For y := 0 To 2 Do
         If aSudoku[x, y] > 9 Then Begin
            z := IntToStr(aSudoku[x, y]);
            i := 1;
            For a := 0 To 2 Do Begin
               For b := 0 To 2 Do
                  j := 0;
               Repeat
                  If ((pos(z[i], IntToStr(aSudoku[a, b])) > 0)) And ((a <> x) Or (b <> y)) Then Begin
                     i := i + 1;
                     j := 0;
                  End Else Begin
                     j := j + 1;
                     If j > 8 Then
                        aSudoku[x, y] := StrToInt(z[i]);
                  End;
               Until (i > length(z)) Or (j > 8);
            End;
         End;
   End;
Ich hoffe einer hat Lust und kriegt nicht sofort Angst bei dem langen Text

Geändert von Marcel2906 (15. Nov 2011 um 14:05 Uhr) Grund: kleiner fehler
  Mit Zitat antworten Zitat