c ++ 2维数组旋转

时间:2018-11-07 22:01:49

标签: c++ multidimensional-array

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

按照我的逻辑,我必须编辑代码才能执行以下操作:

->打印数组第1行
->旋转90
->打印数组第1行
-> rotate90(还原为原始格式)
->旋转180
->打印数组第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);

}

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解您,但是您在这里所做的不是轮换(就矩阵轮换而言)。两次应用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