Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#9

Re: Mal wieder ein Sudoku Problem

  Alt 21. Mai 2006, 22:44
Okay, gehen wir mal durch marabu's Code ... beachte die Kommentarzeilen!

Delphi-Quellcode:
// Col steht für "column" - also Spalte
// Row steht für Zeile

// Konvertiert den den Spalten- und Zeilenindex innerhalb des großen
// 9x9-Feldes in den jeweiligen Index des 3x3-Blocks und innerhalb des
// 3x3-Blocks
function BigToSmall(
// iBigCol und iBigRow sind die Indeces innerhalb des großen 9x9-Feldes
  iBigCol, iBigRow: Integer;
// variable Parameter welche mit Werten gefüllt werden
  var iBlockCol, iBlockRow, iSmallCol, iSmallRow: Integer
): Boolean;
begin
// Überprüfung ob sich die Eingabewert im gültigen Bereich befinden
  Result := (iBigCol in [0..8]) and (iBigRow in [0..8]);
// Füllen der variablen Parameter mit den Werten
  if Result then
  begin
// "Blockspalte" ist der Index der Spalte eines 3x3er Blocks [1]
    iBlockCol := iBigCol div 3;
// "Blockzeile" ist der Index der Zeile eines 3x3er Blocks [1]
    iBlockRow := iBigRow div 3;
// "kleine Spalte" ist der Index der Spalte innerhalb des 3x3er Blocks [2]
    iSmallCol := iBigCol mod 3;
// "kleine Zeile" ist der Index der Zeile innerhalb des 3x3er Blocks [2]
    iSmallRow := iBigRow mod 3;
  end;
end;

// Gegenteil der obigen Funktion BigToSmall()
function SmallToBig(
  iBlockCol, iBlockRow, iSmallCol, iSmallRow: Integer;
  var iBigCol, iBigRow: Integer
): Boolean;
begin
// Überprüfung ob sich die Eingabewert im gültigen Bereich befinden
  Result := (iBlockCol in [0..2]) and (iBlockRow in [0..2])
    and (iSmallCol in [0..2]) and (iSmallRow in [0..2]);
// Füllen der variablen Parameter mit den Werten
  if Result then
  begin
// Spalte innerhalb des 9x9-Feldes anhand der Eingabe berechnen
    iBigCol := 3 * iBlockCol + iSmallCol;
// Zeile innerhalb des 9x9-Feldes anhand der Eingabe berechnen
    iBigRow := 3 * iBlockRow + iSmallRow;
  end;
end;
Und jetzt gucken wir, wie das 9x9-Feld aussieht, wenn wir es nach den oben in den Kommentaren in eckige Klammern gesetzten Ziffern aufschlüsseln:

Spaltenindeces: iBlockCol nach [1]
Code:
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
0  0  0  1  1  1  2  2  2
Zeilenindeces: iBlockRow nach [1]
Code:
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
1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1
1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2
2  2  2  2  2  2  2  2  2
2  2  2  2  2  2  2  2  2
Spaltenindeces: iSmallCol nach [2]
Code:
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
0  1  2  0  1  2  0  1  2
Zeilenindeces: iSmallRow nach [2]
Code:
0  0  0  0  0  0  0  0  0
1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2
0  0  0  0  0  0  0  0  0
1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2
0  0  0  0  0  0  0  0  0
1  1  1  1  1  1  1  1  1
2  2  2  2  2  2  2  2  2
Vielleicht kannst du jetzt begreifen, was gemeint war ...
  Mit Zitat antworten Zitat