我知道這個問題的答案,但我想這樣做對的nxm
一般矩陣。它考慮了矩陣只有一列或一行的情況。
public static void Rotate(int[,] matrix)
{
// Specific cases when matrix has one only row or column
if (matrix.GetLength(0) == 1 || matrix.GetLength(1) == 1)
RotateOneRowOrColumn(matrix);
else
{
int min = Math.Min(matrix.GetLength(0), matrix.GetLength(1)),
b = min/2, r = min % 2;
for (int d = 0; d < b + r; d++)
{
int bkp = matrix[d, d];
ShiftRow(matrix, d, d, matrix.GetLength(1) - d - 1, true);
ShiftColumn(matrix, matrix.GetLength(1) - d - 1, d, matrix.GetLength(0) - d - 1, false);
ShiftRow(matrix, matrix.GetLength(0) - d - 1, d, matrix.GetLength(1) - d - 1, false);
ShiftColumn(matrix, d, d + 1, matrix.GetLength(0) - d - 1, true);
if (matrix.GetLength(0) - 2 * d - 1 >= 1)
matrix[d + 1, d] = bkp;
}
}
}
private static void RotateOneRowOrColumn(int[,] matrix)
{
bool isRow = matrix.GetLength(0) == 1;
int s = 0, e = (isRow ? matrix.GetLength(1) : matrix.GetLength(0)) - 1;
while (s < e)
{
if (isRow)
Swap(matrix, 0, s, 0, e);
else
Swap(matrix, s, 0, e, 0);
s++; e--;
}
}
public static void Swap(int[,] matrix, int from_x, int from_y, int to_x, int to_y)
{
//It doesn't verifies whether the indices are correct or not
int bkp = matrix[to_x, to_y];
matrix[to_x, to_y] = matrix[from_x, from_y];
matrix[from_x, from_y] = bkp;
}
public static void ShiftColumn(int[,] matrix, int col, int start, int end, bool down)
{
for (int i = down ? end - 1 : start + 1; (down && i >= start) || (!down && i <= end); i += down ? -1 : 1)
{ matrix[i + (down ? 1 : -1), col] = matrix[i, col]; }
}
public static void ShiftRow(int[,] matrix, int row, int start, int end, bool left)
{
for (int j = left ? start + 1 : end - 1; (left && j <= end) || (!left && j >= start); j += (left ? 1 : -1))
{ matrix[row, j + (left ? -1 : 1)] = matrix[row, j]; }
}
@StepUp,根據我做的一些測試,我相信我的代碼適用於每個二維矩陣。做你自己的測試,如果你發現任何錯誤,讓我知道。 – dcg
非常感謝!你是超人! :) 非常感謝! – StepUp