我正在用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);
}
谢谢您的帮助。
答案 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