我想顺时针旋转矩阵的外环。
其中n =顺时针旋转的步数。
假设我有一个4x5矩阵。
1 2 3 4 5
6 7 8 9 0
5 4 2 5 7
8 2 7 9 3
现在,如果n = 1,则输出应为: -
6 1 2 3 4
5 7 8 9 5
8 4 2 5 0
2 7 9 3 7
我尝试过以下逻辑:
int temp = im[i][j];
im[i][j] = im[n-1-j][i];
im[n-1-j][i] = im[n-1-i][n-1-j];
im[n-1-i][n-1-j] = im[j][n-1-i];
im[j][n-1-i] = temp;
但是我知道这个逻辑是完全错误的,因为它正在移动整个矩阵。
答案 0 :(得分:2)
你可以这样做:
std::rotate
以下是一个示例实现:
void rotate_border(int m[R][C], int n) {
vector<int> tmp(2*(R+C-2), -1);
for (size_t c = 0 ; c != C ; c++) {
tmp[c] = m[0][c];
tmp[c+C+R-2] = m[R-1][C-c-1];
}
for (size_t r = 1 ; r != R-1 ; r++) {
tmp[C+r-1] = m[r][C-1];
tmp[2*C+R-3+r] = m[R-r-1][0];
}
std::rotate(tmp.begin(), std::next(tmp.begin(), n), tmp.end());
for (size_t c = 0 ; c != C ; c++) {
m[0][c] = tmp[c];
m[R-1][C-c-1] = tmp[c+C+R-2];
}
for (size_t r = 1 ; r != R-1 ; r++) {
m[r][C-1] = tmp[C+r-1];
m[R-r-1][0] = tmp[2*C+R-3+r];
}
}
正数逆时针旋转边框。顺时针旋转从边框大小中减去数字。例如,4×5矩阵具有大小为14的边界,即5+(4-2)+ 5+(4-2)。因此,顺时针旋转1需要旋转14-1
。