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

Элементы размещаются по возрастанию по спирали к центру по часовой стрелке начиная от верхнего левого угла матрицы

27.04.2018, 18:49. Показов 1603. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Элементы размещаются по возрастанию по спирали к центру по часовой
стрелке начиная от верхнего левого угла матрицы, используя пузырьковый метод сортировки
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.04.2018, 18:49
Ответы с готовыми решениями:

Заполнить массив числами от 1 до n^2, расположенными по спирали, начиная с левого верхнего угла и продвигаясь по часовой стрелке
Помогите построить задачку на двумерный массив! Заполнить квадратную таблицу размером n*n последовательными целыми числами от 1 до...

Прокрутить четверти матрицы по часовой стрелке, начиная с верхнего левого угла
Задание: дана матрица размерности nxn. Получить новую матрицу, переставляя её блоки(размером (n/2) x (n/2), то есть четверти) по часовой...

Распечатать элементы матрицы по спирали, начиная с левого верхнего угла
Дана действительная квадратная матрица порядка n. Распечатать элементы матрицы по спирали, начиная с левого верхнего угла.

4
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
28.04.2018, 06:38
Cтранная шняга. Тебе нужно именно сортировать имеющиеся в матрице произвольные элементы, располагая их по спирали, или просто заполнить матрицу числами по спирали?
Если просто заполнить по спирали, то короткий код даст рекурсия

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
int spiral(int m, int n, int j, int i) {
 return i ? m + spiral(n - 1, m, i - 1, m - j - 1) : j;
}
 
int main () {
 const int n = 5;
 const int m = 7;
 int a[n][m];
 for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++) {
   a[i][j] = spiral(m, n, j, i);
   cout.width(4);
   cout << a[i][j] << " ";
  }
  cout << endl;
 }
 cin.get();
 return 0;
}
0
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
28.04.2018, 07:52
Заинтересовала своей бредовостью задачка, если я её вообще верно понял.

Можно, конечно, и сортировать пузырьком, используя обход матрицы по такой спирали, как в предыдущем посте, но извращение же?
Что-то набросал, но где-то ошибаюсь на единичку, в результате чего попадаем на строку номер 8 со значением k=17, хоть и не должны...
если пост попадётся на глаза кому-нить из самых гуристых гуру, они, наверное, неточность сразу заметят

или сам потом замечу, а щас некогда

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
#include <iostream>
using namespace std;
 
void next_indeх (int k, int n, int m, int &i, int &j, int dn, int dm) {
 //i,j - индексы k-го по порядку элемента в матрице n*m при обходе 
 //по спирали к центру по часовой стрелке начиная от верхнего левого угла матрицы
 if (n < 1 || m < 1 || k<1 || k>n*m) { //ошибка
  i = j = -1; return; 
 }
 if (k <= m) { //первая строка
  i = 0 + dn; j = k - 1 + dm; return;
 }
 if (k <= m + n - 1) { //последний столбец
  i = k - m + dn; j = m - 1 + dm; return;
 }
 if (k <= (m + n - 1 + m - 1)) { //последняя строка
  i = n - 1 + dn; j = m - 1 - (k - (m + n - 1)) + dm; return;
 }
 if (k <= (m + n - 1 + m - 1 + n - 2)) { //первый столбец
  i = n - 1 - (k - (m + n - 1 + m - 1)) + dn; j = 0 + dm; return;
 }
 next_indeх (k - (2 * n + 2 * m - 4), n - 2, m - 2, i, j, dn + 1, dm + 1);
}
 
int main() {
 const int n = 4;
 const int m = 4;
 int a[n][m] = {
  { 1,2,3,4 },
  { 4,3,3,1 },
  { 5,1,3,2 },
  { 6,7,3,6 }
 };
 
 int size = n*m;
 for (int i = 0; i < size - 1; i++) {
  for (int j = 0; i < size - 1 - i; j++) {
   int i1,j1,i2,j2;
   next_indeх (i + 1, n, m, i1, j1, 0, 0);
   next_indeх (j + 1, n, m, i2, j2, 0, 0);
   if (a[i1][j1] > a[i2][j2]) {
    int temp = a[i1][j1];
    a[i1][j1] = a[i2][j2];
    a[i2][j2] = temp;
   }
  }
 }
 for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++) {
   cout << a[i][j] << " ";
  }
  cout << endl;
 }
 cin.get();
 return 0;
}
0
 Аватар для ПерС
587 / 490 / 371
Регистрация: 05.11.2013
Сообщений: 1,271
Записей в блоге: 6
28.04.2018, 11:01
А вот так работает. Хы, ред бредкий бред редкий

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
#include <iostream>
using namespace std;
 
void next_indeх(int k, int n, int m, int &i, int &j, int dn, int dm) {
 //i,j - индексы k-го по порядку элемента в матрице n*m при обходе 
 //по спирали к центру по часовой стрелке начиная от верхнего левого угла матрицы
 //(нумерация k с единицы)
 if (n < 1 || m < 1 || k<1 || k>n*m) { //ошибка
  i = j = -1; return;
 }
 if (k <= m) { //первая строка
  i = 0 + dn; j = k - 1 + dm; return;
 }
 if (k <= m + n - 1) { //последний столбец
  i = k - m + dn; j = m - 1 + dm; return;
 }
 if (k <= (m + n - 1 + m - 1)) { //последняя строка
  i = n - 1 + dn; j = m - 1 - (k - (m + n - 1)) + dm; return;
 }
 if (k <= (m + n - 1 + m - 1 + n - 2)) { //первый столбец
  i = n - 1 - (k - (m + n - 1 + m - 1)) + dn; j = 0 + dm; return;
 }
 next_indeх(k - (2 * n + 2 * m - 4), n - 2, m - 2, i, j, dn + 1, dm + 1);
}
 
int main() {
 const int n = 4;
 const int m = 5;
 int a[n][m] = {
  { 1,2,3,4,7 },
  { 4,3,3,1,9 },
  { 5,1,3,2,-2 },
  { 6,7,3,6,15 }
 };
 
 int size = n*m;
 for (int i = 0; i < size - 1; i++) {
  for (int j = i + 1; j < size; j++) {
   int i1, j1, i2, j2;
   next_indeх(i + 1, n, m, i1, j1, 0, 0);
   next_indeх(j + 1, n, m, i2, j2, 0, 0);
   if (a[i1][j1] > a[i2][j2]) {
    int temp = a[i1][j1];
    a[i1][j1] = a[i2][j2];
    a[i2][j2] = temp;
   }
  }
 }
 for (int i = 0; i < n; i++) {
  for (int j = 0; j < m; j++) {
   cout.width (5);
   cout << a[i][j];
  }
  cout << endl;
 }
 cin.get();
 return 0;
}
0
0 / 0 / 0
Регистрация: 27.04.2018
Сообщений: 2
30.04.2018, 20:04  [ТС]
ПерС, Можно пожалуйста без дополнительных функций?) Мы до этого ещё не дошли просто) Я попытался что-то сделать сам, но не могу никак по заданию. То есть по спирали

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
#include "stdafx.h"
#include "iostream"
using namespace std;
void main()
{
    setlocale(0, "Russian");
    int size, x, y;
    int A[5][5];
    bool b = false;
    cout << "Введите размер матрицы: " << endl, cin >> size;
    if (size < 25)
    {
        cout << "Введите минимальный элемент массива: ", cin >> x, cout << "Введите максимальный элемент массива: ", cin >> y;
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                A[i][j] = x + rand() % (1 + (y - x));
                cout << A[i][j] << "\t";
            }
            cout << endl << endl;
        }
        bool b;
        int temp;
        do {
            b = false;
            int k = 0;
            for(k = 0; k < size; k++) {
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++) {
                        if (A[i][j] < A[i - 1][j]) {
                            temp = A[i - 1][j];
                            A[i - 1][j] = A[i][j];
                            A[i][j] = temp;
                            b = true;
                        }
                        if (A[i][j] < A[i - 1][k]) {
                            temp = A[i - 1][k];
                            A[i - 1][k] = A[i][j];
                            A[i][j] = temp;
                            b = true;
                        }
                        if (A[i][j] < A[i][j - 1]) {
                            temp = A[i][j - 1];
                            A[i][j - 1] = A[i][j];
                            A[i][j] = temp;
                            b = true;
                        }
                    }
                }
                
            }
        } while (b == true);
        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                cout << A[i][j] << "  ";
            }
            cout << endl;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.04.2018, 20:04
Помогаю со студенческими работами здесь

Начиная с элемента A[1,1] и перемещаясь по часовой стрелке, вывести все элементы матрицы по спирали
#include &lt;iostream&gt; using namespace std ; #define m 5 int main () { int a ; int i , j , k ; for ( i = 0; i &lt; m; ++i) {...

Заполнить квадратную матрицу, начиная от левого верхнего угла по спирали (возникает исключение)
Задача : Заполнить квадратную матрицу начинаю от левого верхнего угла по спирали : вправо - вниз - влево - вверх. #include...

Функция: заполнить матрицу по часовой стрелке, от левого верхнего края
Нужно заполнить матрицу 9 на 9 числами от 1 до 81, но заполнить нужно по часовой стрелке, от левого верхнего края. При это требуется...

Заполнить квадратную матрицу от левого верхнего угла по спирали
Заполнить матрицу А(9,9), от левого верхнего угла по спирали: вправо - вниз - влево - вверх.

Заполнить массив данными по диагоналям, начиная с левого верхнего угла
Есть двухмерный массив MxN. Параметры M и N задаются с клавиатуры. Заполнить данный массив по диагоналям, начиная с левого верхнего угла,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru