Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18

Сортировка матрицы диагональным зигзагом

26.06.2022, 16:25. Показов 1654. Ответов 24
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно отсортировать матрицу зигзагом как на рисунке, помогите пожалуйста
Название: Screenshot_8.png
Просмотров: 106

Размер: 23.9 Кб

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
#include <iostream>
#include <math.h>
#include <Windows.h>
#include<iomanip>
#include <conio.h>
#include <string.h>
#include <fstream>
using namespace std;
 
 
void Vyvod(double** a, int n,int m) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << setw(4) << a[i][j] << "   ";
        }
        cout << endl;
    }
}
 
void swap(double** arr, int i1, int i2) {
    double* b = arr[i1];
    arr[i1] = arr[i2];
    arr[i2] = b;
}
 
void Sorting(double** a, int n,int m) {
    int i, j, k = 0;
    int diag = 0;
    double** b = new double* [n];
    for (int i = 0; i < n; ++i)
    {
        b[i] = new double[m];
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            b[i][j] = a[i][j];
        }
 
    }
    for (diag = 0; diag < 2 * n; diag++)
    {
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                if (diag + 1 == (i + 1) + (j + 1))
                {
                    if (diag % 2)
                        a[k + 1][j] = b[i][j];
                    else
                        a[i][k + 1] = b[i][j];
                    k = k + 1;
                }
                
            }
    }
        
    }
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(NULL));
    int n=5,m=5, i,j, exit = 1;
    do {
        system("cls");
        double** a = new double * [n];
        for (int i = 0; i < n; ++i)
        {
            a[i] = new double[m];
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                a[i][j] = rand() % (101 - 50)/10.;
            }
            
        }
        cout << "Начальная матрица: " << endl;
        Vyvod(a, n,m);
        cout << endl;
        Sorting(a, n,m);
        cout << endl;
        cout << "Результат: " << endl;
        Vyvod(a, n,m);
        cout << endl;
        cout << "Повторить(1) или выйти(0): ";
        cin >> exit;
} while (exit);
 
return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.06.2022, 16:25
Ответы с готовыми решениями:

Сортировка матрицы зигзагом
Язык:С++ Программа: дана матрица mass, размер генерируется случайным образом от 2 до 10; матрица заполняется числами от 1 до 255; ...

Обход матрицы зигзагом
каким образом сделать такой обход матрицы?

Заполнение матрицы зигзагом
Здравствуйте, уже второй день пытаюсь решить вариант &quot;Г&quot; из этого задания. В интернете есть варианты решений, но мой уровень в знании C++...

24
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 16:54
Цитата Сообщение от weonar Посмотреть сообщение
Нужно отсортировать матрицу зигзагом как на рисунке
А до сортировки она чем и в каком порядке заполнена?
0
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 17:00  [ТС]
заполнена вещественными числами
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 17:06
Цитата Сообщение от weonar Посмотреть сообщение
заполнена вещественными числами
В каком порядке обхода? Это необходимо, т.к. массив двумерный.
0
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 17:14  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
В каком порядке обхода? Это необходимо, т.к. массив двумерный.
Заполняет ряд потом переходит к другому
0
Заблокирован
26.06.2022, 17:27
weonar, а где у вас сама сортировка ?
У вас две задачи.
Обход матрицы "Зиг-Зюгом".
Сортировка по этому обходу.
0
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 17:28  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
weonar, а где у вас сама сортировка ?
У вас две задачи.
Обход матрицы "Зиг-Зюгом".
Сортировка по этому обходу.
вот в этом и проблема, я не понимаю как правильно сделать сортировку
0
Заблокирован
26.06.2022, 17:31
Цитата Сообщение от weonar Посмотреть сообщение
вот в этом и проблема, я не понимаю как правильно сделать сортировку
Вообще, даже одномерный массив никак не отсортировать ?

Добавлено через 32 секунды
А вывести элементы по Зиг-Зюгу можете ?
0
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 17:37  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Вообще, даже одномерный массив никак не отсортировать ?
тоесть предлагаете записать матрицу в одномерный массив пройдясь по ней зигзагом?
0
Заблокирован
26.06.2022, 17:46
Цитата Сообщение от weonar Посмотреть сообщение
тоесть предлагаете записать матрицу в одномерный массив пройдясь по ней зигзагом?
Разве я такое предлагал ?
Там не было ни одного предложения. Только вопросы. И ?ъ

В задаче "намекается" что использовать путь обхода матрицы, как цепочку для сортировки элементов массива.
То-есть , отсортированные данные, нужно расположить по этому пути.
Естественно что все элементы матрицы, можно представить в виде одномерного массива(потому что они все участвуют в сортировке), который и нужно отсортировать.

Цитата Сообщение от weonar Посмотреть сообщение
тоесть предлагаете записать матрицу в одномерный массив пройдясь по ней зигзагом?
Для начала да, только писать ее никуда не нужно, просто выведите на экран все элементы по пути следованию этого Зиг-Зага.
Это первое что нужно сделать. Когда сможете по нему пройтись, сможете и отсортировать и расположить элементы по этому пути.
Способ сортировки, это уже дело следующего шага.
1
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 17:47
Цитата Сообщение от weonar Посмотреть сообщение
тоесть предлагаете записать матрицу в одномерный массив пройдясь по ней зигзагом?
Не совсем.
Я сделал для целых чисел, могу отдать, как есть.

1
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 17:55  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Я сделал для целых чисел, могу отдать, как есть.
Буду благодарен
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 18:04
Цитата Сообщение от weonar Посмотреть сообщение
Буду благодарен
Поздняк метаца. Я уже переделываю для вещественных.
Вот так норм, не?

1
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 18:07  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
Поздняк метаца. Я уже переделываю для вещественных.
Вот так норм, не?
Конечно)
Но мне и вправду хватило бы и прошлого варианта)
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 18:22
Лучший ответ Сообщение было отмечено weonar как решение

Решение

Цитата Сообщение от weonar Посмотреть сообщение
Но мне и вправду хватило бы и прошлого варианта
Хороший мальчик.
Кот (для вещественных чисел):
Кликните здесь для просмотра всего текста












































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
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cassert>
 
#define RAND_RANGE(a, b) (rand() % ((b) - (a) + 1) + (a))
#define RANDOM (1.0 * rand() / RAND_MAX) 
#define UNASSIGNED -100500.0
 
 
double** new_matrix(unsigned rows, unsigned cols)
{
  double** x = new double*[rows];
  for (int row = 0; row != rows; row++)
  {
    x[row] = new double[cols];
    for (int col = 0; col != cols; col++)
      x[row][col] = 5 - 10 * RANDOM; //rand() % 100;  
  }
  return x;
}
 
void free_matrix(double** src, unsigned rows)
{
  for (int row = 0; row != rows; row++) delete []src[row];
  delete []src;
}
 
void print_matrix(double** src, unsigned rows, unsigned cols, const char* header)
{
  printf("\n%s [%d x %d]\n", header, rows, cols);
  for (int row = 0; row != rows; row++)
  {
    for (int col = 0; col != cols; col++) printf(" %+6.4lf", src[row][col]);
    printf("\n");  
  }
}
 
bool next(double** x, unsigned rows, unsigned cols, int &row, int &col)
{
  #define bounds(z, max) (0 <= (z) && (z) < (max)) // 0 ≤ z < max
  //#define possible(r, c) (bounds(r, rows) && bounds(c, cols) && !x[r][c])
  #define possible(r, c) (bounds(r, rows) && bounds(c, cols) && x[r][c] < UNASSIGNED)
  
  if (!col)
  {
    if (possible(row - 1, col + 1)) { row--, col++; return true; }    
    if (possible(row + 1, col)) { row++; return true; }    
    if (possible(row, col + 1)) { col++; return true; }    
    return false;                     
  }                                                        
 
  if (!row)
  {
    if (possible(row + 1, col - 1)) { row++, col--; return true; }    
    if (possible(row, col + 1)) { col++; return true; }   
    if (possible(row + 1, col)) { row++; return true; }   
    return false;  
  }
 
  if (1 + col == cols)
  {
    if (possible(row + 1, col - 1)) { row++, col--; return true; }    
    if (possible(row, col + 1)) { col++; return true; }   
    if (possible(row + 1, col)) { row++; return true; }   
    return false;  
  }
 
  if (1 + row == rows)
  {
    if (possible(row - 1, col + 1)) { row--, col++; return true; }    
    if (possible(row + 1, col)) { row++; return true; }    
    if (possible(row, col + 1)) { col++; return true; }    
    return false;  
  }
 
  if (possible(row - 1, col + 1)) { row--, col++; return true; }    
  if (possible(row + 1, col - 1)) { row++, col--; return true; }    
 
  assert(false);  
  return false;  
}
 
// Быстрая сортировка одномерного массива. Спёр отсюдова: 
// https://www.cyberforum.ru/cpp-beginners/thread186552.html#post1085608
template<class T>
void quickSortR(T* a, long N) 
{
  long i = 0, j = N;             
  T temp, p;
  p = a[ N>>1 ];                 
 
  do 
  {
    while (a[i] < p) i++;
    while (a[j] > p) j--;
 
    if (i <= j) 
    {
      temp = a[i]; a[i] = a[j]; a[j] = temp;
      i++; j--;
    }
  } while ( i<=j );
 
  if (j > 0) quickSortR(a, j);
  if (N > i) quickSortR(a + i, N - i);
}
 
// сортировка "змейкой"
void sort_matrix(double** x, unsigned rows, unsigned cols)
{
  double* temp = new double[rows * cols], *ptr = temp;
  
  for (int r = 0; r != rows; r++)
    for (int c = 0; c != cols; c++)
      *ptr++ = x[r][c], x[r][c] = UNASSIGNED - 1.0; // 0.0
      
  quickSortR(temp, rows * cols);    
 
  ptr = temp;
  int row = 0, col = 0; 
  do x[row][col] = *ptr++;
  while (next(x, rows, cols, row, col));
  
  delete[] temp;
}
 
#define ROWS  14
#define COLS  11
 
int main(void)
{
  srand(time(0));
  double** x = new_matrix(ROWS, COLS);
  print_matrix(x, ROWS, COLS, " >> source matrix: ");
  //fill_matrix(x, ROWS, COLS);
  sort_matrix(x, ROWS, COLS);
  print_matrix(x, ROWS, COLS, " >> sorted matrix: ");
  free_matrix(x, ROWS);
  printf("\n ...Press any key to exit...");
  getchar();
  return 0;
}
0
Заблокирован
26.06.2022, 18:31
Verevkin, Ленивый в гору не пойдет, ленивый гору заведет.
C++
112
double* temp = new double[rows * cols], *ptr = temp;
Изображения
 
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 18:33
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ленивый в гору не пойдет, ленивый гору заведет.
Тебе-то чо не нравится?
0
0 / 0 / 0
Регистрация: 07.12.2020
Сообщений: 18
26.06.2022, 19:03  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
#define UNASSIGNED -100500.0
Цитата Сообщение от Verevkin Посмотреть сообщение
bool next(double** x, unsigned rows, unsigned cols, int &row, int &col)
{
  #define bounds(z, max) (0 <= (z) && (z) < (max)) // 0 ≤ z < max
  //#define possible(r, c) (bounds(r, rows) && bounds(c, cols) && !x[r][c])
  #define possible(r, c) (bounds(r, rows) && bounds(c, cols) && x[r][c] < UNASSIGNED)
if (!col)
  {
    if (possible(row - 1, col + 1)) { row--, col++; return true; }    
    if (possible(row + 1, col)) { row++; return true; }    
    if (possible(row, col + 1)) { col++; return true; }    
    return false;                    
  }                                                        
if (!row)
  {
    if (possible(row + 1, col - 1)) { row++, col--; return true; }    
    if (possible(row, col + 1)) { col++; return true; }  
    if (possible(row + 1, col)) { row++; return true; }  
    return false;  
  }
if (1 + col == cols)
  {
    if (possible(row + 1, col - 1)) { row++, col--; return true; }    
    if (possible(row, col + 1)) { col++; return true; }  
    if (possible(row + 1, col)) { row++; return true; }  
    return false;  
  }
if (1 + row == rows)
  {
    if (possible(row - 1, col + 1)) { row--, col++; return true; }    
    if (possible(row + 1, col)) { row++; return true; }    
    if (possible(row, col + 1)) { col++; return true; }    
    return false;  
  }
if (possible(row - 1, col + 1)) { row--, col++; return true; }    
  if (possible(row + 1, col - 1)) { row++, col--; return true; }    
assert(false);  
  return false;  
}
Можете объяснить зачем эти define и как работает данная функция?
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 19:06
Цитата Сообщение от weonar Посмотреть сообщение
Можете объяснить зачем эти define и как работает данная функция?
0
Злостный нарушитель
 Аватар для Verevkin
10233 / 5662 / 1260
Регистрация: 12.03.2015
Сообщений: 26,252
26.06.2022, 19:06
Цитата Сообщение от weonar Посмотреть сообщение
Можете объяснить зачем эти define и как работает данная функция?
Лень.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2022, 19:06
Помогаю со студенческими работами здесь

Обход матрицы зигзагом
Произвести обход элементов матрицы по маршруту

Найти наибольший элемент в каждой строке матрицы, после чего поменять его местами с диагональным
Во входном файле in.txt задана квадратная матрица из целых чисел, например: 1 7 4 3 6 3 2 0 2 0 8 7 4 5 7 6

В каждой строке матрицы A (n, n) найти наибольший элемент и поменять его местами с соответствующим диагональным элементом.
В каждой строке матрицы A (n, n) найти наибольший элемент и поменять его местами с соответствующим диагональным элементом. Нужна прога

В каждом ряду матрицы найти самый большой элемент и поменять его местами с соответствующим диагональным элементом
У каждом ряду матрице A (n, n) найти самый большой елемент и поменять его местами с соответствующим диагональмым елементом (матрица...

Сортировка массива и выстраивание его в матрицу зигзагом по побочной диагонали
Люди добрые. Помогите прошу вас!! Есть программа, сортировки заданного массива и выстраивание его в матрицу зигзагом по ГЛАВНОЙ диагонали...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru