Es gibt tonnenweise guten Code hier, aber ich möchte nur zeigen, was geometrisch vor sich geht, damit Sie die Logik des Codes ein wenig besser verstehen können. Hier ist, wie ich dies angehen würde.
Verwechseln Sie dies zunächst nicht mit der Transposition, die sehr einfach ist.
Die Grundidee besteht darin, sie als Schichten zu behandeln und eine Schicht nach der anderen zu drehen.
sagen wir, wir haben einen 4x4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
nach einer Drehung im Uhrzeigersinn um 90 ergibt sich
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
Also zerlegen wir das Ganze, indem wir zunächst die 4 Ecken im Wesentlichen drehen
1 4
13 16
dann drehen wir den folgenden Diamanten, der ein wenig schief ist
2
8
9
15
und dann die 2. schräge Raute
3
5
12
14
Damit ist der äußere Rand abgedeckt. Wir machen also im Wesentlichen eine Schale nach der anderen, bis
schließlich das mittlere Feld (oder, wenn es ungerade ist, nur das letzte Element, das sich nicht bewegt)
6 7
10 11
Lassen Sie uns nun die Indizes der einzelnen Schichten herausfinden. Gehen wir davon aus, dass wir immer mit der äußersten Schicht arbeiten, so machen wir
[0,0] -> [0,n-1], [0,n-1] -> [n-1,n-1], [n-1,n-1] -> [n-1,0], and [n-1,0] -> [0,0]
[0,1] -> [1,n-1], [1,n-2] -> [n-1,n-2], [n-1,n-2] -> [n-2,0], and [n-2,0] -> [0,1]
[0,2] -> [2,n-2], [2,n-2] -> [n-1,n-3], [n-1,n-3] -> [n-3,0], and [n-3,0] -> [0,2]
und so weiter und so fort bis wir die Hälfte der Kante hinter uns haben
Das Muster ist also im Allgemeinen
[0,i] -> [i,n-i], [i,n-i] -> [n-1,n-(i+1)], [n-1,n-(i+1)] -> [n-(i+1),0], and [n-(i+1),0] to [0,i]