向左或向右旋转90度
基本思想是把它当作层,我们每次旋转一层。
假设我们有一个 4 x4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
旋转后顺时针旋转 90
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
我们先分解一下,首先旋转 4个角
1 4
13 16
然后我们旋转下面的菱形
2
8
9
15
然后是 2和倾斜的菱形
3
5
12
14
这样照顾外缘基本上一个壳,直到我们这么做
最后一个中间的方块( 或者如果是奇数,最后一个不移动的元素)
6 7
10 11
现在我们来计算每个层的索引,假设我们总是使用最外层的层,我们正在做
[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]
等等直到我们到达边缘
一般情况下,模式是
[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]
- 向右旋转90度
private static char[][] rotateRight90(String[] in) {
char[][] inChar = toCharArray(in);
char tmp;
int n = in.length;
for (int i = 0; i < n / 2; i++) {
for (int j = i + 1; j < n - i; j++) {
System.out.println("转换" + i + "," + j);
tmp = inChar[i][j];
inChar[i][j] = inChar[n - 1 - j][i];
inChar[n - 1 - j][i] = inChar[n - 1 - i][n - 1 - j];
inChar[n - 1 - i][n - 1 - j] = inChar[j][n - 1 - i];
inChar[j][n - 1 - i] = tmp;
}
}
return inChar;
}
- 向左旋转90度
旋转180度
a[i][j] = a[n-i-1][n-j-1],直接替换即可
private static char[][] rotate180(String[] in) {
char[][] inChar = toCharArray(in);
char tmp;
int n = in.length;
for (int i = 0; i <= n / 2; i++) {
for (int j = 0; j < n - i; j++) {
tmp = inChar[i][j];
inChar[i][j] = inChar[n - i - 1][n - j - 1];
inChar[n - i - 1][n - j - 1] = tmp;
}
}
return inChar;
}