@kwhk:
Zu CheckCombi:
Delphi-Quellcode:
const
Size=3;
Numbers=Size*Size;
RowSum=(1+Numbers)*Numbers div 2 div Size;
var
Combi:Array[0..Numbers-1] of Byte;
Square:Array[0..Size-1,0..Size-1] of Byte absolute Combi;
FUNCTION CheckCombi:Boolean;
var I:Integer; Entries:Set of 1..Numbers;
begin
Entries:=[];
for I:=High(Combi) downto 0 do Include(Entries,Combi[I]);
Result:=Entries=[1..Numbers];
end;
Das in der Prozedur deklarierte "Entries" ist ein Set, das die Elemente 1 bis Numbers enthalten kann.
Wenn du einem Set ein Element mehrfach hinzufügst, ist es im Set trotzdem nur einmal enthalten.
Erste Zeile:
"Entries" wird = [] gesetzt, das Set enthält dann nichts.
Zweite Zeile:
Alle Werte aus "Combi" werden zu "Entries" hinzugefügt.
Dritte Zeile:
Prüft, ob "Entries" = [1,2,3, ...,Numbers] ist, anders ausgedrückt ob "Entries" alle Werte von 1 bis Numbers enthält.
Wenn das der Fall ist, sind in "Combi" die Werte von 1 bis Numbers, die Combi (korrekterweise die Permutation, wie Schokohase anmerkte) ist dann wirklich eine Permutatation der Werte 1..Numbers.
Sorry, bin nicht so gut im Erklären.