Naja alternativ mit den Bits eines Integers rechnen?
Delphi-Quellcode:
function SpalteTesten(ASpalte : Integer) : Boolean;
const
CARDINAL_POS : array [1..9] of Cardinal = (1, 2, 4, 8, 16, 32, 64, 128, 256);
ALL_SET = 511;
var
i : Integer;
Werte : Cardinal; // Gibt es eine art UShortInt?
begin
Werte := 0;
for i := 0 to 8 do
begin
Werte := Werte or CARDINAL_POS[sudoku[<hier den wert :D>]];
end;
Result := Werte and ALL_SET = ALL_SET;
end;
Ich hoffe das geht so
aber meine Idee war, dass du das n-te Bit auf 1 setzt, wenn die Zahl vorhanden ist. Und zum Schluss müsste dann dort irgendwie 0...0111111111 stehen (die 9 niedrigsten Bits stehen auf 1).
Dazu setzten wir in der Schleife das n-te Bit auf 1 indem wir den Wert vorher nehmen (ich betrachte erstmal nur die 9 niedrigsten Bits). Zum Beispiel sieht Werte vorher so aus:
000000000
Wenn dann im aktuellen Feld eine 3 steht, dann wird das 3. Bit auf 1 gesetzt:
000000100
Wenn wir dann wieder auf ein Feld mit einer 3 treffen passiert aber gar nichts mehr.
Und dann ganz zum Schluss überprüft er ob alle auf 1 stehen. Und zwar ist 111111111b = 511d (wenn ich mich irre). das heißt wir müssen nur die unteren 9 Bits betrachten. Dazu können wir and verwenden:
Code:
0..irgendwas..0111111111 and
000000000000000111111111 =
============================
000000000000000111111111
Weil bei add ist das Bit im Ergebnis nur 1, wenn die Bits in den beiden Werten 1 sind. Wenn dann das zweite und Ergebnis gleich sind, dann ist auch das obere mindestens so groß wie das obere. Ich weiß klingt ein bisschen komisch
Aber dafür gibt es ein ganz gutes Tutorial hier irgendwo.
MfG
Fabian
PS: Und wenn du Platz sparen willst kannst du satt 32 bit auch 16bit verwenden
9 bit würden reichen, aber sowas gibt es nicht