С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71

Превратить двумерный массив в одномерный путём считывания его элементов по часовой стрелке

12.10.2015, 21:03. Показов 1242. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, задача заключается в том, что бы превратить двумерный массив (он должен быть динамическим и пользователь вводит каждый элемент) в одномерный путём считывания его элементов по часовой стрелке (как на картинке). Размерность задаётся пользователем, впрочем, как и элементы. Так вот, проблема именно с этим считыванием. Как его сделать правильно?? Я пробовал с помощью строк (string), но столкнулся с проблемой, что не считывает столбцы (горизонтально) и строки наоборот (с права налево). Думаю, снизу вверх будет та же беда))) Прошу помощи! Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>;
#include<cstring>
 
using namespace std;
 
int main(){
    int m,n,k;
    string str1,str2;
    cin>>m;
    cin>>n;
    char**arr1=new char *[m];
    for (int i=0;i<m;i++) arr1[i]=new char [n];
    for (int i=0;i<m;i++) for (int j=0;j<n;j++) cin>>arr1[i][j];
    for (int i=0;i<m;i++){
        for (int j=0;j<n;j++) cout<<arr1[i][j]<<" ";
        cout<<endl;
    }
    for (int j=0;j<n-1;j++) str1+=arr1[0][j];
    for (int i=0;i<m-1;i++) str2+=arr1[i][n];
 
    cout<<str2;
system ("pause");
return 0;
}
Суть в том, что я пытаюсь, что я хотел вывести этот ход по часовой стрелке с помощью нескольких строк (str1,str2,str3, и т д), а потом всех их сложить в одну str=\sum str(i). Но, как видите, не закончил, так как на str2 уже не работало((
Изображения
 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2015, 21:03
Ответы с готовыми решениями:

Дан квадратный двумерный массив, повернуть его на 90 градусов по часовой стрелке без использования второго массива
Дан квадратный двумерный массив, повернуть его на 90 градусов по часовой стрелке без использования второго массива.

Преобразование матрицы в одномерный массив по часовой стрелке
Преобразование матрицы в одномерный массив по часовой стрелке в C++. К примеру: 4 5 7 3 6 8 9 2 1 4 5 7 8 1 2 9 3 6

Двумерный массив. Заполнение по часовой стрелке к центру.
заполнить массив 7 на 7 элементов последовательность чисел от 1 до 49 по часовой стрелке к центру. Пожалуйста очень надо :)Перенесено из...

3
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
12.10.2015, 21:05  [ТС]
Главный вопрос в том -- как сделать так, что бы считывало элементы не только слева на право и заносило их в str(i). Если так нельзя, то предложите иной способ пожалуйста
0
0 / 0 / 2
Регистрация: 26.12.2013
Сообщений: 71
15.10.2015, 21:21  [ТС]
Ну так что, как делать? Выручайте!!
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
15.10.2015, 22:43
Чуток громоздко, но зато работает с прямоугольными матрицами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <random>
 
using namespace std;
 
int* GenerateMatrix(size_t rows, size_t cols, int min, int max);
void PrintMatrix(int* M, size_t rows, size_t cols);
int* Spiral(int* A, int rows, int cols);
 
int main()
{
    //размеры матрицы
    const size_t rows1 = 5;
    const size_t cols1 = 3;
 
    //генерация и вывод в консоль матрицы A
    int* A = GenerateMatrix(rows1, cols1, 0, 10);
    cout << "Matrix A:" << endl;
    PrintMatrix(A, rows1, cols1);
 
    //заполнение вектора элементами матрицы, расположенными по спирали 
    int* vec = Spiral(A, rows1, cols1);
    cout << "Spiral: " << endl;
    PrintMatrix(vec, 1, rows1*cols1);
 
    system("pause");
    return 0;
}
 
int* GenerateMatrix(size_t rows, size_t cols, int min, int max){
 
    //выделение памяти 
    size_t size = rows*cols;
    int* M = new int[size];
 
    //настройка генератора
    random_device rd;
    mt19937 mersenne(rd());
    uniform_int_distribution<int> random_element(min, max);
 
    // заполняем числами от min до max  
    for (size_t i = 0; i < size; i++){
        M[i] = random_element(mersenne);
    }
 
    //возвращаем указатель на матрицу
    return M;
}
 
void PrintMatrix(int* M, size_t rows, size_t cols){
    for (size_t i = 0; i < rows; i++){
        for (size_t j = 0; j < cols; j++)
            cout << setw(4) << M[i*cols + j];       
        cout << endl;                               
    }
}
 
int* Spiral(int* A, int rows, int cols) {
    int direction(0); //направление движения: 0 - вправо, 1 - вниз, 2 - влево, 3 - вверх;
    int indent_top(0), indent_right(0), indent_bottom(0), indent_left(0);   //отступы о ткрая матрицы
    int x(0), y(0);                                                         //координаты курсора внутри матрицы
    bool move(true);                                                        //флаг возможности дальнейшего движения
    int* result = new int[rows*cols];                                       
    size_t counter(0);
    do{
        result[counter] = A[y*cols + x];
        counter++;
 
        switch (direction) {
            //==============движение вправо
        case 0:
            //проверка возможности продолжить движение
            if (x + 1 < cols - indent_right) {
                x++;
                break;
            }
            //проверка возможности движения вниз
            if (y + 1 < rows - indent_bottom) {
                y++;
                direction = 1;
                indent_top++;
                break;
            }
            //конец
            move = false;
            break;
 
            //==============движение вниз
        case 1:
            //проверка возможности продолжить движение
            if (y + 1 < rows - indent_bottom) {
                y++;
                break;
            }
            //проверка возможности движения влево
            if (x > indent_left) {
                x--;
                direction = 2;
                indent_right++;
                break;
            }
            //конец
            move = false;
            break;
 
            //==============движение влево
        case 2:
            //проверка возможности продолжить движение
            if (x > indent_left) {
                x--;
                break;
            }
            //проверка возможности движения вверх
            if (y > indent_top) {
                y--;
                direction = 3;
                indent_bottom++;
                break;
            }
            //конец
            move = false;
            break;
 
            //==============движение вверх
        case 3:
            //проверка возможности продолжить движение
            if (y > indent_top) {
                y--;
                break;
            }
            //проверка возможности движения вправо
            if (x + 1 < cols - indent_right) {
                x++;
                direction = 0;
                indent_left++;
                break;
            }
            //конец
            move = false;
            break;
        default:
            break;
        }
    } while (move);
    return result;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2015, 22:43
Помогаю со студенческими работами здесь

Заполнить двумерный массив змейкой по часовой стрелке
Заполнить массив размерность М*N, М и N задаются пользователем, числами от 1 и сколько получится ( в зависимости от размерности). По...

Можно ли путём поворота элементов матрицы А по часовой стрелке на 90 градусов получить совмещение матриц А и В
Пожалуйста помогите!!!!!!!!!!!!!!!! Можно ли путём поворота элементов матрицы А по часовой стрелке на 90 градусов получить совмещение...

Дан двумерный массив 2n*2n. В заданном массиве поменять блоки n*n по часовой стрелке
Дан двумерный массив 2n*2n. В заданном массиве поменять блоки n*n по часовой стрелке.

Дан массив N×M. Требуется перевернуть его по часовой стрелке на 90 градусов.
Вот, решил идеально правильно, вывел элементы - не засчитало!!! Дан массив N×M. Требуется перевернуть его по часовой стрелке на...

Дан массив N × M. Требуется повернуть его по часовой стрелке на 90 градусов
Дан массив N × M. Требуется повернуть его по часовой стрелке на 90 градусов. Входные данные На первой строке даны натуральные числа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru