编程题旋转图像怎么画出来

时间:2025-01-25 06:21:41 游戏攻略

旋转一个 n × n 的二维矩阵顺时针 90 度可以通过多种方法实现,以下是几种常见的方法:

方法一:使用辅助数组

这种方法通过创建一个新的矩阵来存储旋转后的结果,然后将其复制回原矩阵。虽然这种方法简单,但它使用了额外的空间,不符合题目要求的原地旋转。

```cpp

void rotate(vector>& matrix) {

int n = matrix.size();

vector> new_matrix(n, vector(n));

for (int i = 0; i < n; ++i) {

for (int j = 0; j < n; ++j) {

new_matrix[j][n - 1 - i] = matrix[i][j];

}

}

matrix = new_matrix;

}

```

方法二:原地旋转,空间优化

这种方法通过四次翻转来实现原地旋转,不需要额外的空间。具体步骤如下:

1. 沿主对角线翻转。

2. 沿水平中线翻转。

```cpp

void rotate(vector>& matrix) {

int n = matrix.size();

// 主对角线翻转

for (int i = 0; i < n; ++i) {

for (int j = i; j < n; ++j) {

swap(matrix[i][j], matrix[j][i]);

}

}

// 水平中线翻转

for (int i = 0; i < n / 2; ++i) {

for (int j = 0; j < n; ++j) {

swap(matrix[i][j], matrix[n - 1 - i][j]);

}

}

}

```

方法三:分层旋转

这种方法通过逐层旋转来实现原地旋转。每一层找到四个顶点,旋转 90 度,然后通过对顶点坐标的改变,来将其他的元素旋转 90 度。

```cpp

void rotate(vector>& matrix) {

int n = matrix.size();

int p = 0;

int len = matrix.length - 1;

int add;

int temp;

while (p < len) {

add = p;

while (add < len) {

temp = matrix[p][add];

matrix[p][add] = matrix[len - add][p];

matrix[len - add][p] = matrix[len - p][len - add];

matrix[len - p][len - add] = matrix[add][len - p];

matrix[add][len - p] = temp;

add++;

}

p++;

}

}

```

总结

以上三种方法都可以实现图像的顺时针旋转 90 度,选择哪种方法取决于具体的需求和限制条件。如果需要原地旋转且空间有限,建议使用方法二或方法三。如果可以使用额外的空间,方法一也是一个可行的选择。