如何在C ++中用n步旋转矩阵的外环?

时间:2018-04-05 19:23:47

标签: c++ c++11 matrix

我想顺时针旋转矩阵的外环。

其中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;

但是我知道这个逻辑是完全错误的,因为它正在移动整个矩阵。

1 个答案:

答案 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];
    }
}

Demo.

正数逆时针旋转边框。顺时针旋转从边框大小中减去数字。例如,4×5矩阵具有大小为14的边界,即5+(4-2)+ 5+(4-2)。因此,顺时针旋转1需要旋转14-1