可能重复: 将图像旋转90度的算法?(没有额外内存)
说到90度,我的意思是如果:
A = {1,2,3,
4,5,6,
7,8,9}
然后,在90度旋转之后,A变成:
A = {7,4,1,
8,5,2,
9,6,3}
发布于 2010-08-15 10:49:52
让a
是一个基于nxn数组0的索引
f = floor(n/2)
c = ceil(n/2)
for x = 0 to f - 1
for y = 0 to c - 1
temp = a[x,y]
a[x,y] = a[y,n-1-x]
a[y,n-1-x] = a[n-1-x,n-1-y]
a[n-1-x,n-1-y] = a[n-1-y,x]
a[n-1-y,x] = temp
编辑--如果您想避免使用temp,这一次在python中可以工作(它也向正确的方向旋转)。
def rot2(a):
n = len(a)
c = (n+1) / 2
f = n / 2
for x in range(c):
for y in range(f):
a[x][y] = a[x][y] ^ a[n-1-y][x]
a[n-1-y][x] = a[x][y] ^ a[n-1-y][x]
a[x][y] = a[x][y] ^ a[n-1-y][x]
a[n-1-y][x] = a[n-1-y][x] ^ a[n-1-x][n-1-y]
a[n-1-x][n-1-y] = a[n-1-y][x] ^ a[n-1-x][n-1-y]
a[n-1-y][x] = a[n-1-y][x] ^ a[n-1-x][n-1-y]
a[n-1-x][n-1-y] = a[n-1-x][n-1-y]^a[y][n-1-x]
a[y][n-1-x] = a[n-1-x][n-1-y]^a[y][n-1-x]
a[n-1-x][n-1-y] = a[n-1-x][n-1-y]^a[y][n-1-x]
注:这只适用于整数矩阵。
发布于 2010-08-15 10:46:48
转置和交换行或列(取决于您想要左转还是右转)。
例如。
1) original matrix
1 2 3
4 5 6
7 8 9
2) transpose
1 4 7
2 5 8
3 6 9
3-a) change rows to rotate left
3 6 9
2 5 8
1 4 7
3-b) or change columns to rotate right
7 4 1
8 5 2
9 6 3
所有这些操作可以在不分配内存的情况下完成。
发布于 2010-08-15 10:50:44
该算法是旋转每个“环”,工作从最外面到最里面。
AAAAA
ABBBA
ABCBA
ABBBA
AAAAA
该算法首先旋转所有A,然后是B,然后是C。旋转一个环需要一次移动4个值。
指数i从0.环宽-1,例如,对于A,宽度为5.
(i,0) -> temp
(0, N-i-1) -> (i, 0)
(N-i-1, N-1) -> (0, N-i-1)
(N-1, i) -> (N-i-1, N-1)
temp -> (N-1, i)
然后,对每一个连续的内环重复这一点,以抵消将环宽度减少2的协调。
代码中出现了另一个答案,所以我不重复了。
https://stackoverflow.com/questions/3488691
复制