【问题标题】:c++ 2 dimension array rotationc++ 二维数组旋转
【发布时间】:2019-02-01 06:03:44
【问题描述】:

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

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

-> 打印数组第 1 行
-> 旋转 90
-> 打印数组第 1 行
-> rotate90(恢复原状)
-> 旋转 180
-> 打印数组第 1 行
-> rotate180(原创)
-> 旋转 270
-> 打印数组第 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);

}

感谢您的帮助。

【问题讨论】:

  • 4 个 7x7 矩阵副本不会破坏内存库,除非您处于最极端的嵌入式系统中。制作四份副本,旋转 0º、90º、180º、270º(您只需要“旋转 90º”功能 - 您复制原件并将副本旋转 90º;复制 90º 旋转矩阵并将副本旋转 90º(用于 180º 旋转) );您复制 180º 旋转的矩阵并将副本旋转 90º(用于 270º 旋转)。现在您安排打印页面上 4 次旋转中的每一个的行。
  • 即使不允许复印,也只需要旋转 90º 功能。您打印未旋转矩阵的第一行;然后旋转 90º 并打印第一行;然后再旋转 90º 并打印现在旋转 180º 矩阵的第一行;然后再旋转 90º 并打印现在 270º 旋转矩阵的第一行;然后再旋转 90º(以恢复原样)并在旋转后继续打印矩阵的第二行。
  • 使用 C++ 的标准 IO 流,一旦您发出换行符,就没有 100% 可靠的返回方式。您可以分配一个 4 E 宽的缓冲区,并在生成它们时将旋转后的 E 复制到其中,间隔一点以便于阅读,然后将大缓冲区打印到屏幕上。
  • 您可能会注意到,要在 90º 旋转后恢复到原始状态,您需要进行 270º 旋转(或 -90º 旋转),而不是再旋转 90º,反之,270º 旋转。当然,两次 180 度旋转确实可以让您回到起点。

标签: c++ multidimensional-array


【解决方案1】:

我不确定我明白了,但你在这里所做的不是旋转(在矩阵旋转的意义上)。当您应用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2022-01-07
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多