将M * N矩阵顺时针旋转90度,C ++

时间:2018-09-01 19:58:19

标签: c++ c++11 vector

我正在尝试旋转chars向量的向量。

我进行了二维矢量矩阵设置。现在,矩阵从文件中获取输入,我使用vector.push_back(c)将字符添加到vvc; vvc数组的一个例子就是这样

aaaaa
azzza
azaza
azzza
azaaa
azaaa
azaaa
aaaaa

我有vvc设置,但是我试图将其旋转90度。我将其逆时针旋转90度,但我需要将其顺时针旋转90度。

截至目前,我的代码已完成

90 counter clock
aaaaaaaa
azzzzzza
azazaaaa
azzzaaaa
aaaaaaaa

,并通过此循环完成;

cout <<"\n90 counter clock"<<endl;
    for (size_t colNo = 0; colNo < kvsize2; colNo++)
    {
        for (const auto &row : twovector)
        {
            char colVal = row.at(colNo);
            cout << colVal;
        }
        cout << endl;
    }

我只是在学习向量及其范围。尝试执行递减循环几乎可以工作,但总是让我陷入段错状态。

“已解决” 我在用

twovector.push_back(temp);

使用

twovector.insert(twovector.begin(),temp);

给我

90 counter clock aaaaaaaa azzzzzza aaaazaza aaaazzza aaaaaaaa

2 个答案:

答案 0 :(得分:1)

如果我说对了,而您想要做的就是顺时针打印90度矩阵,请尝试以下代码:

for (int colNo = 0; colNo < vec[0].size(); colNo++)
{
    for (int i = vec.size() - 1; i >= 0; i--)
    {
        const auto& row = vec[i];
        int colVal = row.at(colNo);
        cout << colVal;
    }
    cout << endl;
}

答案 1 :(得分:1)

解决问题的特定部分:

  

如果有人对如何旋转M * N 2d向量数组有任何提示或建议

C ++善于从数据中分离算法。

请注意,答案有点冗长,目的是为了教程。
让我们开始吧!

我们希望从rotate_2d_matrix_clockwise算法中获得3个功能:

  • 它应适用于所有数据类型,即intchardouble或任何用户定义的类型。
  • 它应与不同类型的容器一起使用,例如std::arraystd::vector
  • 它应该是可链接的,即用户应该能够对rotate_2d_matrix_clockwise返回的结果调用rotate_2d_matrix_clockwise,以实现2次轮换。

一旦我们明确了要求,就可以为算法起草一些用例。

std::vector<std::vector<char>> data = { {'a', 'b', 'c', 'd'}, 
                                        {'e', 'f', 'g', 'h'}, 
                                        {'i', 'j', 'k', 'l'} };
rotate_2d_matrix_clockwise(data); // rotating 2d-matrix of vector<char>

std::array<std::array<int, 4>, 3> data2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// rotating 2d-matrix of array<int>, twice
rotate_2d_matrix_clockwise(rotate_2d_matrix_clockwise(data2))); 

因此,让我们使用一些模板来创建通用的2d顺时针旋转功能。

我们的rotate_2d_matrix_clockwise将:

  • 使用original_matrix并返回一个新的rotated_matrix
  • 自动推断出传递给它的容器的尺寸,即 M x N
  • 创建rotated_matrix并将其传递给助手功能rotate_2d_matrix_clockwise_impl,在该功能中将完成实际工作。

那么rotate_2d_matrix_clockwise的{​​{1}}的实现将如何?

std::array

整洁而精确。
template<typename T, size_t M, size_t N> auto rotate_2d_matrix_clockwise(std::array<std::array<T, M>, N> const & original_matrix) -> std::array<std::array<T, N>, M> { std::array<std::array<T, N>, M> rotated_matrix; rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); // rotate return rotated_matrix; } 的{​​{1}}的实现有点混乱。

rotate_2d_matrix_clockwise

现在让我们看一下实际旋转算法std::vector的外观。
应该注意的是,该算法与容器和/或所包含的数据无关。它只是专注于旋转。

template<typename Matrix2D>
auto rotate_2d_matrix_clockwise(Matrix2D const & original_matrix) -> Matrix2D
{
    int const M = original_matrix[0].size(); // deduce M and N
    int const N = original_matrix.size();

    Matrix2D rotated_matrix; // vector has no form, hence we have to resize it for `N x M`
    rotated_matrix.resize(M);
    for (auto x = 0; x < M; ++x) {
        rotated_matrix[x].resize(N);
    }

    rotate_2d_matrix_clockwise_impl(original_matrix, rotated_matrix, M, N); // rotate
    return rotated_matrix;
}

这是一个用C ++ 11编译的完整示例。

rotate_2d_matrix_clockwise_impl