如果我有一个像这样的网格的多维指针表示
char **p;
int w; // width (i.e. number of columns)
int h; // height (i.e. number of rows)
如何为 NxM 网格创建顺时针旋转 90 度的副本?
我试过将高度分配为新宽度,将宽度分配为新高度,然后转置这些值。然后我打算通过反转行的值来完成,但我没有设法做到这一点。
最佳答案
实际的转置是相当痛苦的:您必须将每个元素从“现在的位置”移动到“它应该在转置中的位置”。如果您确实有一个指针 p
指向第一个 M
指针,并且每个 M
指针都指向第一个 N
char
s(用作大小为 M
的数组,大小为 N
的数组 char
s):
+---+ +---+---+---+---+
p ---> | * | ----> | a | b | c | d |
+---+ +---+---+---+---+
| * | --
+---+ \ +---+---+---+---+
| * | -----------> | i | j | k | l |
+---+ \ +---+---+---+---+
\
\ +---+---+---+---+
--> | e | f | g | h |
+---+---+---+---+
然后你需要一个新的指针(我将其称为 q
)指向 N 个指针中的第一个,每个指针指向 M 个 char
中的第一个(注意:这与您要求的换位不同):
+---+ +---+---+---+
q ---> | * | -----> | a | e | i |
+---+ +---+---+---+
| * | --
+---+ \
| * |etc \ +---+---+---+
+---+ ---> | b | f | j |
| * |etc +---+---+---+
+---+
但是,如果您可以忍受相对烦人的下标编写和任何缓存未命中对运行时的影响,您可以简单地访问 p[i][j]
作为 p[j] [i]
或 p[N-1-j][i]
等,以“假装”事物被转置。这对于一些宏来说可能是最简单的:
#define ORIENTATION_A(p, M, N, i, j) ((p)[i][j])
#define ORIENTATION_B(p, M, N, i, j) ((p)[(N)-1-(j)][i])
/* etc */
(注意:以上均未测试)。
关于c - 旋转多维指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9972750/