题目
给一个int类型的NxN矩阵,旋转90°
解题思路
书里的解题思路是把矩阵从外到里按层遍历,每次遍历过程中对四边的每一个数字进行遍历。
先上一个4x4矩阵的代码:
void rotate(int matrix[4][4], int n) {
for (int layer = 0; layer < n / 2; layer++) {
int first = layer;
int last = n - 1 - layer;
for (int i = first; i < last; i++) {
int offset = i - first;
// save top
int top = matrix[first][i];
// top = right
matrix[first][i] = matrix[i][last];
// right = bottom
matrix[i][last] = matrix[last][last - offset];
// bottom = left
matrix[last][last - offset] = matrix[last - offset][first];
// left = top
matrix[last - offset][first] = top;
}
}
}
再上一个通用版代码
void rotate(int **matrix, int n) {
for (int layer = 0; layer < n / 2; layer++) {
int first = layer;
int last = n - 1 - layer;
for (int i = first; i < last; i++) {
int offset = i - first;
// save top
int top = *((int *)matrix + first * n + i);
// top = right
*((int *)matrix + first * n + i) = *((int *)matrix + i * n + last);
// right = bottom
*((int *)matrix + i * n + last) = *((int *)matrix + last * n + last - offset);
// bottom = left
*((int *)matrix + last * n + last - offset) = *((int *)matrix + (last - offset) * n + first);
// left = top
*((int *)matrix + (last - offset) * n + first) = top;
}
}
}
测试代码
void test() {
int matrix[4][4] = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16};
rotate1((int **)matrix, 4);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
printf("%d\t", matrix[i][j]);
}
putchar('\n');
}
}
int main() {
test();
}