首页 > 解决方案 > c++ 二维数组旋转

问题描述

我正在用 C++ 编写一个程序来显示一个二维数组,然后将其旋转 90、180 和 270 度。该数组是由 E 和空格组成的大写字母“E”。我已经编写了程序,但是当我运行它时,它确实打印了 E 的旋转但垂直(从上到下),我的教授希望它们旋转但水平打印(从左到右)。

按照我的逻辑,我必须编辑我的代码才能做到:

-> 打印数组第 1 行
-> rotate90
-> 打印数组第 1 行
-> rotate90(恢复为原始)
-> rotate180
-> 打印数组第 1 行
-> rotate180(原始)
-> rotate270
-> 打印数组第 1 行
->旋转 270(原始)->

...继续 7 次,直到打印所有行。

我知道有一种更简单的方法,但我不知道该怎么做。

#include <iostream>

using namespace std;

char eArray[][7]{
    {'E','E','E','E','E','E','E'},
    {'E',' ',' ',' ',' ',' ',' '},
    {'E',' ',' ',' ',' ',' ',' '},
    {'E','E','E','E','E',' ',' '},
    {'E',' ',' ',' ',' ',' ',' '},
    {'E',' ',' ',' ',' ',' ',' '},
    {'E','E','E','E','E','E','E'},
};
int n = 7;

void rotateArray90(char a[][7]){

for (int i = 0; i < n; i += 1) {
  for (int j = i+1; j < n; j += 1) {
    swap(eArray[i][j], eArray[j][i]);
}}}

void flipArray180(char a[][7]){

for (int i = 0; i < n; i += 1) {
  for (int j = 0; j < n/2; j += 1) {
    swap(eArray[i][j], eArray[i][n-1-j]);
}}}

void rotateArray270(char a[][7]){

for (int i = 0; i < n; i += 1) {
  for (int j = 0; j < n/2; j += 1) {
    swap(eArray[i][j], eArray[n-1-i][j]);
}}}

void printArray(char a[][7]){

for (int i = 0; i < n; ++i){
  for (int j = 0; j < n; ++j){
        cout << eArray[i][j] <<" ";
  }cout << endl;
}}

int main(){

printArray(eArray);
cout <<"\n";

rotateArray90(eArray);
printArray(eArray);
cout <<"\n";
rotateArray90(eArray);

flipArray180(eArray);
printArray(eArray);
cout <<"\n";
flipArray180(eArray);

rotateArray270(eArray);
printArray(eArray);
cout <<"\n";
rotateArray270(eArray);

}

感谢您的帮助。

标签: c++multidimensional-array

解决方案


我不确定我得到了你,但你在这里做的不是旋转(在矩阵旋转的意义上)。当您应用rotateArray90(eArray)两次时,您应该让您的阵列旋转 180 度,但它会变回原始阵列。这是我的轮换方法,看看是否有帮助。当您使用它时,您不需要单独的方法来旋转 180、270 等度,您只需应用它 2、3、... 次。第 4 次旋转后,数组返回原始值。它适用于任何矩形数组,不仅是n x n. 而且您不必使用原始指针,而是使用容器。

template<typename T>
void printArray(const vector<vector<T>> &vch) {
    for (int i = 0; i < vch.size(); ++i) {
        for (int j = 0; j < vch[0].size(); ++j) {
            cout << vch[i][j] << " ";
        }
        cout << endl;
    }
}

template<typename T>
void rotateArray(vector<vector<T>> &v)
{
    vector<vector<T>>rotated;
    for (size_t i = 0; i < v[0].size(); i++) {
        vector<T> newRow;
        for (int j = v.size() - 1; j >=0; j--) {
            newRow.push_back(v[j][i]);
        }
        rotated.push_back(newRow);
    }
    v = rotated;
}

下面是一个如何使用的例子:

int main() {
    vector<vector<char>> vch = {
        {'E', 'E', 'E', 'E', 'E', 'E', 'E'},
        { 'E',' ',' ',' ',' ',' ',' ' },
        { 'E',' ',' ',' ',' ',' ',' ' },
        { 'E','E','E','E','E',' ',' ' },
        { 'E',' ',' ',' ',' ',' ',' ' },
        { 'E',' ',' ',' ',' ',' ',' ' },
        { 'E','E','E','E','E','E','E' },
    };


    printArray<char>(vch);
    cout << "\n";
    rotateArray<char>(vch);
    printArray<char>(vch);
    cout << "\n";
    rotateArray<char>(vch);
    printArray<char>(vch);
    cout << "\n";
    rotateArray<char>(vch);
    printArray<char>(vch);
    cout << "\n";

    return 0;
}

//orignal
    E E E E E E E
    E
    E
    E E E E E
    E
    E
    E E E E E E E
 // rotated 90
    E E E E E E E
    E     E     E
    E     E     E
    E     E     E
    E     E     E
    E           E
    E           E
 // rotated 180    
    E E E E E E E
                E
                E
        E E E E E
                E
                E
    E E E E E E E
 // rotated 270    
    E           E
    E           E
    E     E     E
    E     E     E
    E     E     E
    E     E     E
    E E E E E E E
    // rotated 360
    E E E E E E E
    E
    E
    E E E E E
    E
    E
    E E E E E E E

推荐阅读