挑战任务
在计算机中,一张数字图像,可以被看做是一个矩阵或者说数组。
学过线性代数的同学对矩阵肯定不陌生。一般来说,图像是一个标准的矩形,有着宽度(width
)和高度(height
)。而矩阵有着行(row
)和列(column
),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就把图像作为一个矩阵,把对图像的操作转换成对矩阵的操作,实际上所有的图像处理工具都是这么做的。
所以我们如果要对图像进行操作,其实也就是在对一个数组进行操作。
本关要求你编写代码实现对一张图像的90°
旋转,即对矩阵的90°
旋转。
补全函数void rotate(vector<vector<int> >& matrix)
,实现对输入的数组进行旋转的功能。
注意:
你必须使用原地算法来旋转图像,而不能重新创建一个数组,本关不需要你输出数组,只需要修改数组metrix
即可。
输入:3 3
1 2 3
4 5 6
7 8 9
原地旋转,使其变为:
7 4 1
8 5 2
9 6 3
注意:这里要用原地算法
class Task{
public:
void rotate(vector<vector<int> >& matrix){
/********* Begin *********/
int length = matrix.size();
//主对角线翻转
for (int i = 0; i < length; i++) {
for (int j = 0; j < length - i; j++) {
swap(matrix[i][j], matrix[length - j - 1][length - i - 1]);
}
}
//上下翻转
for (int i = 0; i < length/2; i++) {
for (int j = 0; j < length; j++) {
swap(matrix[i][j], matrix[length - i - 1][j]);
}
}
/********* End *********/
}
};
class Task{
public:
void rotate(vector<vector<int> >& matrix){
/********* Begin *********/
int length = matrix.size();
//斜对角线翻转
for(int i = 0;i < length;i ++)
for(int j = i;j < length;j ++)
swap(matrix[i][j], matrix[j][i]);
//左右翻转
for(int i = 0;i < length;i ++)
for(int j = 0;j < length/2;j ++)
swap(matrix[i][j], matrix[i][matrix.size() - 1 -j]);
/********* End *********/
}
};