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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Okas43
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 36
#1

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

28.10.2015, 16:42. Просмотров 1220. Ответов 11

Нужно заполнить двумерный массив 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++
За данными числам n и m заполнить двумерный массив размером n × m числами от 1 до n × m "диагоналями", как показано в на рисунке: 1 2 ...

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

Заполнить числами матрицу слева от главной диагонали и справа побочной - C++
Нужно заполнить числами матрицу слева от главной диагонали и справа побочной, то есть, вот таким способом Не могу придумать алгоритм...

Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх. - C++
Здравствуйте, уважаемые форумчане. Очень нужна ваша помощь: перевести код из С в С++. Сам пытался но ничего путного не вышло. Очень буду...

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5603 / 2637 / 242
Регистрация: 01.11.2011
Сообщений: 6,496
Завершенные тесты: 1
28.10.2015, 16:53     Заполнить матрицу по диагонали #2
Первые попавшиеся:
Заполнить матрицу числами по диагонали
Заполнить матрицу ЛП, от правого верхнего угла по диагонали: влево - вниз
Заполнить матрицу ЛП, от левого нижнего угла по диагонали: влево - вверх.

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

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

Заполнить матрицу ЛП, от левого верхнего угла по диагонали: вправо - вверх - C++
Здравствуйте, уважаемые форумчане. Я новичок в С++. Прошу помочь. Заполнить матрицу ЛП, от левого верхнего угла по диагонали: вправо -...

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

Заполнить матрицу линейной последовательностью (0-81), от левого верхнего угла по диагонали: вправо - вверх - C++
Помогите пожалуйста написать программу: Заполнить матрицу линейной последовательностью (1-81), от левого верхнего угла по диагонали:...

Заполнить матрицу линейной последовательностью от левого верхнего угла по диагонали вправо вверх - C++
Заполнить матрицу линейной последовательностью от левого верхнего угла по диагонали вправо -вверх


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

Или воспользуйтесь поиском по форуму:
Krock21rus
74 / 74 / 19
Регистрация: 18.11.2013
Сообщений: 373
Завершенные тесты: 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     Заполнить матрицу по диагонали
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru