c++ - 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);
}
感谢您的帮助。
解决方案
我不确定我得到了你,但你在这里做的不是旋转(在矩阵旋转的意义上)。当您应用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
推荐阅读
- d - 如何在超出范围时调用析构函数?
- reactjs - 如何使用详尽的 lint 规则进行挂载/卸载效果
- django - 如何将 url 参数传递给模板中的 url 标签
- uwsgi - 禁用 uWSGI 日志记录
- python - Python selenium present_of_element_located 只有href
- r - 在R中查找数字的产品
- python - 将索引重新对齐到更改的 python 集合
- python - 我在 python 中编码时遇到问题
- net-snmp - 网络 SNMP:snmpbulkget - genError 失败
- npm - 当脚本返回 1 时,如何将 gitlab 作业设置为失败?