Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
28.10.2015, 16:42     Заполнить матрицу по диагонали #1
Нужно заполнить двумерный массив 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

Заранее спасибо за любую помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 16:42     Заполнить матрицу по диагонали
Посмотрите здесь:

C++ Заполнить матрицу линейной последовательностью (0-81), от левого верхнего угла по диагонали: вправо - вверх
C++ Заполнить матрицу случайными числами. Отобразить мат-рицу симметрично относительно главной диагонали.
Заполнить матрицу, от левого верхнего угла по диагонали: вправо - вверх C++
C++ Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх.
C++ Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
28.10.2015, 16:53     Заполнить матрицу по диагонали #2
Первые попавшиеся:
Заполнить матрицу числами по диагонали
Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз
Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх.

Для нахождения большего количества решений воспользуйтесь поиском по форуму: Поиск по форуму.
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
28.10.2015, 17:08  [ТС]     Заполнить матрицу по диагонали #3
вот нашел подобное, только нужно не слева на право, а справа налево:
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;
}
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,855
Записей в блоге: 17
28.10.2015, 17:15     Заполнить матрицу по диагонали #4
SatanaXIII, мне кажется, проще написать функцию (принимающую два указателя - begin и end) для перегонки любой последовательности элементов в матрице (диагонали, столбца или строки) в std::vector. А с вектором можно делать что угодно.
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
28.10.2015, 17:16  [ТС]     Заполнить матрицу по диагонали #5
в том то и дело, нужно это сделать без участия функции
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,855
Записей в блоге: 17
28.10.2015, 17:24     Заполнить матрицу по диагонали #6
Цитата Сообщение от Okas43 Посмотреть сообщение
сделать без участия функции
Опять гвозди плоскогубцами забивать... Можно, но зачем?
Миниатюры
Заполнить матрицу по диагонали  
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
28.10.2015, 17:42  [ТС]     Заполнить матрицу по диагонали #7
ибо их не изучали, а с ними не примут работу
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,855
Записей в блоге: 17
28.10.2015, 21:22     Заполнить матрицу по диагонали #8
Цитата Сообщение от 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;
}
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
28.10.2015, 22:19  [ТС]     Заполнить матрицу по диагонали #9
http://www.cyberforum.ru/attachment....1&d=1446059947
ты не понял немног, но почти правильно
Изображения
 
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
28.10.2015, 22:52     Заполнить матрицу по диагонали #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
на самом деле можно выразить очень просто число: представить его практически одной формулой:
узнаём номер диагонали справа налево, 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");
    }
}
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 35
29.10.2015, 21:14  [ТС]     Заполнить матрицу по диагонали #11
спасиб
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2015, 13:46     Заполнить матрицу по диагонали
Еще ссылки по теме:

C++ Заполнить матрицу ЛП, от левого верхнего угла по диагонали: вправо - вверх
C++ Заполнить матрицу числами по диагонали
C++ Заполнить числами матрицу слева от главной диагонали и справа побочной

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

Или воспользуйтесь поиском по форуму:
Krock21rus
73 / 73 / 19
Регистрация: 18.11.2013
Сообщений: 369
Завершенные тесты: 2
30.10.2015, 13:46     Заполнить матрицу по диагонали #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
я тут подумал, а зачем хранить матрицу? если можно её не хранить:
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);
        }
    }
}
Yandex
Объявления
30.10.2015, 13:46     Заполнить матрицу по диагонали
Ответ Создать тему

Метки
двумерный, массив, с++
Опции темы

Текущее время: 18:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru