【问题标题】:Rotate a matrix (2d-std::vector) by 90°将矩阵 (2d-std::vector) 旋转 90°
【发布时间】:2020-07-25 21:20:54
【问题描述】:

我正在用 C++ 为大学的一个项目编写一个 IQ 益智游戏,我将这些棋子的形式存储在 vector 矩阵中。我需要能够顺时针和逆时针旋转它们,但到目前为止我还没有找到任何关于如何做到这一点的信息。

作为一个例子,我有一个这样存储的紫色块:

vector<vector<int>> cherry = {{0,4},
                              {4,4},
                              {4,0}};

我怎样才能旋转它以便像这样存储这件作品?

4 4 0
0 4 4

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 内向量的长度总是2?

标签: c++ algorithm vector c++14


【解决方案1】:

顺时针旋转:

vector<vector<int>> rotateClockwise90(const vector<vector<int>>& x)
{
    vector<vector<int>> result;

    for (unsigned i = 0; i < x[0].size(); i++) {
        vector<int> row;
        for (int j = x.size() - 1; j >= 0; j--) {
            row.push_back(x[j][i]);
        }
        result.push_back(row);
    }

    return result;
}

逆时针旋转:

vector<vector<int>> rotateCounterclockwise90(const vector<vector<int>>& x)
{
    vector<vector<int>> result;

    for (int i = x[0].size() - 1; i >= 0; i--) {
        vector<int> row;
        for (int j = 0; j < x.size(); j++) {
            row.push_back(x[j][i]);
        }
        result.push_back(row);
    }

    return result;
}

Live demo

【讨论】:

    【解决方案2】:

    仔细观察,你可以得出结论,它类似于普通的转置,行倒序,因此你可以使用类似下面的东西

    #include <vector>
    #include <iostream>
    
    auto rotate(const std::vector<std::vector<int>>& mat){
        std::vector<std::vector<int>> toBeReturned (mat[0].size(), std::vector<int>(mat.size()));
        for(size_t i{}; i < toBeReturned .size(); ++i){
            for(size_t j{}; j < toBeReturned[0].size(); ++j){
                toBeReturned[i][j] = mat[j][mat[0].size()-1-i];
            }
        }
        return toBeReturned;
    }
    
    int main() {
        std::vector<std::vector<int>> cherry = {{0,4},
                                      {4,4},
                                      {4,0}};
        auto rotated = rotate(cherry);
        for(size_t i{}; i < rotated.size(); ++i){
            for(size_t j{}; j < rotated[0].size(); ++j){
                std::cout << rotated[i][j] << " ";
            }
            std::cout << "\n";
        }
    
    }
    

    Live

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-04
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2012-10-24
      • 2012-05-24
      • 2013-02-09
      相关资源
      最近更新 更多