Вращение двухмерного массива в С ++

Я пишу программу на C++, чтобы отобразить двумерный массив, а затем повернуть его на 90, 180 и 270 градусов. Массив представляет собой заглавную букву «Е», состоящую из букв «Е» и пробелов. Я написал программу, но когда я запускаю ее, она печатает буквы 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-х поворотов на странице.

Jonathan Leffler 07.11.2018 23:16

Даже если вам не разрешено делать копии, вам все равно понадобится только функция поворота на 90 °. Вы печатаете первую строку неизмененной матрицы; затем поверните на 90 ° и выведите первую строку; затем поверните еще на 90 ° и напечатайте первую строку матрицы, повернутой теперь на 180 °; затем вы поворачиваете еще на 90 ° и печатаете первую строку матрицы, повернутой на 270 °; затем вы поворачиваете еще на 90 ° (чтобы вернуться к оригиналу) и переходите к печати второй строки матрицы после выполнения поворота.

Jonathan Leffler 07.11.2018 23:19

В стандартном потоке ввода-вывода C++, когда вы вводите новую строку, нет 100% надежного способа вернуться. Вы можете выделить буфер шириной 4 E и скопировать в него повернутые Es по мере их создания, немного расставив их для облегчения чтения, а затем распечатать большой буфер на экране.

user4581301 07.11.2018 23:19

Вы можете заметить, что для возврата к исходному изображению после поворота на 90 ° вам нужно сделать поворот на 270 ° (или -90 °), а не еще на 90 °, и наоборот, для поворота на 270 °. Разумеется, два поворота на 180 ° вернут вас туда, откуда вы начали.

Jonathan Leffler 07.11.2018 23:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
1 305
1

Ответы 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

Другие вопросы по теме