就地旋转意味着您修改矩阵本身,而不创建新矩阵。但是,如果您要旋转 90 度,则当然只能在矩阵为正方形时就地旋转。但是,如果您旋转 180 度,则始终可以就地旋转。让我们看一个非方阵:
{ a, b, c, d, e, f },
{ g, h ,i, j, k, l },
{ m, n, o, p, q, r }
如果我们将它旋转 180 度,我们最终会得到:
{ r, q, p, o, n, m },
{ l, k, j, i, h, g },
{ f, e, d, c, b, a }
您可以看到 [r, c] 处的项目以 [#rows - r - 1, #columns - c - 1] 结束。(当然是从 0 开始的),所以 [0, 1] 处的 b 结束于 [3 - 0 - 1, 6 - 1 - 1]
您可以使用的方法是:首先交换 a 和 r,然后交换 b 和 q,等等。这类似于反转 1 维数组,只是在 2 维中。就像反转一维数组一样,我们只进行了一半:我们交换的最后两项是 i 和 j。我使该方法通用,因此您可以使用它旋转任何矩阵。
static void Rotate180<T>(T[,] matrix) {
int rowCount = matrix.GetLength(0), columnCount = matrix.GetLength(1);
int max = rowCount * columnCount / 2, m = 0;
for (int r = 0; ; ++r) {
for (int c = 0; c < columnCount; ++c) {
Swap(matrix, r, c, rowCount - r - 1, columnCount - c - 1);
if (++m >= max) return;
}
}
}
static void Swap<T>(T[,] matrix, int r1, int c1, int r2, int c2) {
T temp = matrix[r1, c1];
matrix[r1, c1] = matrix[r2, c2];
matrix[r2, c2] = temp;
}