【发布时间】: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