0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36

Заполнить матрицу по диагонали

28.10.2015, 16:42. Показов 28971. Ответов 11

Author24 — интернет-сервис помощи студентам
Нужно заполнить двумерный массив n-го порядка справа-налево снизу числами (от min к max)
25 23 20 16 11
24 21 17 12 7
22 18 13 8 4
19 14 9 5 2
15 10 6 3 1

Заранее спасибо за любую помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2015, 16:42
Ответы с готовыми решениями:

Заполнить матрицу 9x9 случайными числами. Отобразить матрицу симметрично относительно главной диагонали
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали

Заполнить матрицу числами по диагонали
За данными числам n и m заполнить двумерный массив размером n × m числами от 1 до n × m "диагоналями", как показано в на...

Заполнить матрицу по диагонали от правого верхного угла
хелп диагональ

11
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
28.10.2015, 16:53
Первые попавшиеся:
Заполнить матрицу числами по диагонали
Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз
Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх.

Для нахождения большего количества решений воспользуйтесь поиском по форуму: Поиск по форуму.
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
28.10.2015, 17:08  [ТС]
вот нашел подобное, только нужно не слева на право, а справа налево:
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
int main()
{
    int arr[5][5]; // объявили массив
    int i, j;
    i = 5 - 1; //инициализируем индексы начальной ячейкой
    j = 0;
    for (int num = 1; num <= 5*5; num++) // основной цикл, заполняющий массив
    {
        arr[i][j] = num; // заносим число в ячейку массива
                         // сейчас мы передвинем индексы на следующую ячейку
                         // нам понадобится пара буферных переменных для грубого хака (см. дальше)
        int i0, j0;
 
        i0 = i;
        j0 = j;
 
        if ((i != 0) && (j != 0)) // если мы не достигли границы ни по одному из индексов
        {
            i--;
            j--;
        }
        else if ((j == 0) && (i == 0)) // вот здесь - грубый хак на случай, когда мы приходим в клетку 0,0
        {
            i = 5 - 2;
            j = 5 - 1;
        }
        else if (j == 0) // проверяем, не дошли ли мы до границы по j
        {
            j = 5 - i0;
            i = 5 - 1;
        }
        else // if (i == 0) // проверяем, не дошли ли мы до границы по i
        {
            i = 5 - 2 - j0;
            j = 5 - 1;
        }
    }
    puts("Result Array:");
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            cout << arr[i][j] << "\t" ;
        }
        cout <<"\n";
    }
    getchar();
    return 0;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5287 / 2375 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
28.10.2015, 17:15
SatanaXIII, мне кажется, проще написать функцию (принимающую два указателя - begin и end) для перегонки любой последовательности элементов в матрице (диагонали, столбца или строки) в std::vector. А с вектором можно делать что угодно.
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
28.10.2015, 17:16  [ТС]
в том то и дело, нужно это сделать без участия функции
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5287 / 2375 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
28.10.2015, 17:24
Цитата Сообщение от Okas43 Посмотреть сообщение
сделать без участия функции
Опять гвозди плоскогубцами забивать... Можно, но зачем?
Миниатюры
Заполнить матрицу по диагонали  
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
28.10.2015, 17:42  [ТС]
ибо их не изучали, а с ними не примут работу
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5287 / 2375 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
28.10.2015, 21:22
Цитата Сообщение от Okas43 Посмотреть сообщение
ибо их не изучали, а с ними не примут работу
Okas43, нате Вам тогда ужос-ужос без функций:
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
#include <iostream>
 
int main()
{
    const int ROW = 5;    // количество рядов (строк)
    const int COL = 5;    // количество столбцов (колонок)
 
    int arr[ROW][COL];    // объявили массив
 
    int prev_r = ROW;        // индекс ряда предыдущей ячейки
    int prev_c = COL - 2;    // индекс столбца предыдущей ячейки
 
    int add_to_row = 0;
    int add_to_col = 0;
 
    int start_value = 10;    // с этой циферьки начнётся заполнение массива
 
    for (int r = ROW - 1, c = COL - 1; r >= 0 && c >= 0; r += add_to_row, c += add_to_col)
    {
        arr[r][c] = start_value++;
 
        if (r < prev_r && c > prev_c) // если мы пришли сюда по диагонали снизу вверх, то
        {
            if (c+1 == COL || r-1 < 0) // если движение дальше по диагонали снизу вверх невозможно, то
            {
                if (r-1 < 0)// если невозможно пойти вертикально наверх, то
                {   // идём по горизонтали справа налево
                    add_to_row = 0;
                    add_to_col = -1;
                }
                else
                {   // иначе пойдём вертикально снизу вверх
                    add_to_row = -1;
                    add_to_col = 0;
                }
            }
            else
            {   // иначе продолжаем двигаться по диагонали снизу вверх
                add_to_row = -1;
                add_to_col = +1;
            }
        }
        else if (r < prev_r && c == prev_c)// если мы пришли сюда вертикально снизу вверх, то
        {
            if (c-1 < 0) // если невозможно пойти сверху вниз по диагонали
            {   // пойдём вертикально снизу вверх
                add_to_row = -1;
                add_to_col = +1;
            }
            else
            {
                // иначе разворачиваемся и идём сверху вниз по диагонали
                add_to_row = +1;
                add_to_col = -1;
            }
        }
        else if (r > prev_r && c < prev_c) // если мы пришли сюда по диагонали cверху вниз, то
        {
            if (r+1 == ROW || c-1 < 0) // если движение дальше в этом же направлении невозможно, то
            {
                if (c-1 < 0) // если невозможно пойти горизонтально справа налево, то
                {   // пойдём вертикально снизу вверх
                    add_to_row = -1;
                    add_to_col = 0;
                }
                else
                {   // иначе пойдём горизонтально справа налево
                    add_to_row = 0;
                    add_to_col = -1;
                }
            }
            else
            {   // иначе продолжаем двигаться сверху вниз по диагонали
                add_to_row = +1;
                add_to_col = -1;
            }
        }
        else if (r == prev_r && c < prev_c) // если мы пришли сюда горизонтально справа налево
        {
            if (r-1 < 0)    // если невозможно двигаться снизу вверх по диагонали
            {   // пойдём сверху вниз по диагонали
                add_to_row = +1;
                add_to_col = -1;
            }
            else
            {   // разворачиваемся и идём снизу вверх по диагонали
                add_to_row = -1;
                add_to_col = +1;
            }
        }
 
        prev_r = r;
        prev_c = c;
 
    }
 
    // выводим массив на экран монитора:
    for (int i = 0; i < ROW; ++i)
    {
        for (int j = 0; j < COL; ++j)
            std::cout << arr[i][j] << "\t";
        std::cout << "\n";
    }
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
28.10.2015, 22:19  [ТС]
https://www.cyberforum.ru/atta... 1446059947
ты не понял немног, но почти правильно
Изображения
 
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
28.10.2015, 22:52
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

на самом деле можно выразить очень просто число: представить его практически одной формулой:
узнаём номер диагонали справа налево, n - номер диагонали, число это n*(n-1)/2 + расстояние до вершины диагонали

Добавлено через 26 минут
както так:

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
int main(int argv, char **argc)
{
    int n;
    cin >> n;
    int mas[n][n];
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int numdiagonal = n+n-i-j+1;
            if(numdiagonal<=n)
            {
                mas[i-1][j-1] = numdiagonal*(numdiagonal-1)/2+min(i,n-j+1);
            }
            else mas[i-1][j-1] = (n+1)*n/2 + ((n-1)*n/2 - ((i+j-1)*(i+j)/2)) +  i;
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%6d",mas[i][j]);
        }
        printf("\n");
    }
}
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
29.10.2015, 21:14  [ТС]
спасиб
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
30.10.2015, 13:46
Лучший ответ Сообщение было отмечено Okas43 как решение

Решение

я тут подумал, а зачем хранить матрицу? если можно её не хранить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argv, char **argc)
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int tmp;
            int numdiagonal = n+n-i-j+1;
            if(numdiagonal<=n)
            {
                tmp = numdiagonal*(numdiagonal-1)/2+min(i,n-j+1);
            }
            else tmp = (n+1)*n/2 + ((n-1)*n/2 - ((i+j-1)*(i+j)/2)) +  i;
            printf("%6d",tmp);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2015, 13:46
Помогаю со студенческими работами здесь

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

Заполнить матрицу натуральными числами змейкой по диагонали
Помогите с задачей :( Входные данные Входная строка содержит числа N и M , разделённые пробелом Выходные данные Программа должна...

Заполнить матрицу ЛП, от левого верхнего угла по диагонали вправо — вверх
Помогите пожалуйста с лабораторной . 1. Создать квадратную матрицу целых чисел размером 9х9. В индивидуальных заданиях указано, какую...

Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз
https://www.cyberforum.ru/attachments/243234d1363129946 не могу понять что у меня не правильно, помогите пожалуйста. #include...

Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх
Здравствуйте! Помогите с кодом. Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх.


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Введение в Q# - язык квантовых вычислений от Microsoft
EggHead 19.05.2025
Microsoft вошла в гонку технологических гигантов с собственным языком программирования Q#, специально созданным для разработки квантовых алгоритмов. Но прежде чем погружаться в синтаксические дебри. . .
Безопасность Kubernetes с Falco и обнаружение вторжений
Mr. Docker 18.05.2025
Переход организаций к микросервисной архитектуре и контейнерным технологиям сопровождается лавинообразным ростом векторов атак — от тривиальных попыток взлома до многоступенчатых кибератак, способных. . .
Аугментация изображений с Python
AI_Generated 18.05.2025
Собрать достаточно большой датасет для обучения нейронной сети — та ещё головная боль. Часами вручную размечать картинки, скармливать их ненасытным алгоритмам и молиться, чтобы модель не сдулась при. . .
Исключения в Java: советы, примеры кода и многое другое
Javaican 18.05.2025
Исключения — это объекты, созданные когда программа сталкивается с непредвиденной ситуацией: файл не найден, сетевое соединение разорвано, деление на ноль. . . Список можно продолжать до бесконечности. . . .
Как сделать SSO (Single Sign-On) в C# приложении
stackOverflow 18.05.2025
SSO — это механизм, позволяющий пользователю пройти аутентификацию один раз и получить доступ к нескольким приложениям без повторного ввода учетных данных. Вы наверняка сталкивались с ним, когда. . .
Kubernetes с Apache Flink для обработки данных в реальном времени
Mr. Docker 17.05.2025
Kubernetes — это целая философия управления распределёнными приложениями. В отличие от "примитивных" решений вроде Docker Swarm, K8s (как его ласково называют в тусовке DevOps-инженеров) предлагает. . .
Использование декораторов в Python
py-thonny 17.05.2025
Если вы когда-нибудь задумывались о том, как красиво расширить функциональность кода без лишней возни и дублирования, декораторы в Python — та самая волшебная палочка, которую вы искали. По сути, это. . .
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru