1

Тема: Заміна елементів діагоналей в двовимірному масиві.

Попередня назва: Допоможіть з двухвимірним масивом.

Задача звучить так: Написати програму, яка обчислює максимум серед сум діагоналей матриці і заміняє знайденим максимумом всі елементи діагоналей.Я поки що найшов тільки суму головної та побічної діагоналі.

#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <time.h>
#include <iomanip>

using namespace std;

void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(0));

    const int N = 5, M = 5;
    int arr[N][M];

    for (int i = 0;i < N;i++)
    {
        for (int j = 0;j < M;j++)
        {
            arr[i][j] = rand() % 15 - 5;
        }
    }

    int sum1 = 0, sum2 = 0;

    for (int i = 0;i < N;i++)
    {
        sum1 += arr[i][i];
        sum2 += arr[i][N - i - 1];
    }



    _getch();
}

2

Re: Заміна елементів діагоналей в двовимірному масиві.

belo4ka1894 написав:

Написати програму, яка обчислює максимум серед сум діагоналей матриці і заміняє знайденим максимумом всі елементи діагоналей.

Задача зформульована не достатньо чітко, щоб її розвязати.
Давайте зробимо це на конкретному прикладі. Дано матрицю

 5, 18,  7, 12,  3
 8,  6,  7,  9,  0
11,  2, 10,  1,  2
 4,  5, 15,  0, 12
 1, 13,  8,  6,  5

Яким має бути результат ?

belo4ka1894 написав:

Я поки що найшов тільки суму головної та побічної діагоналі.

А потрібно знайти суми ще якигось діагоналей ?

Може потрібно рахувати всі діагоналі ...

Тоді результат буде виглядати якось так :

34, 39, 42, 36, 34
36, 42, 39, 35, 36
42, 34, 28, 39, 36
35, 36, 34, 36, 42
39, 35, 36, 42, 30

3

Re: Заміна елементів діагоналей в двовимірному масиві.

Задачу можна задати таким алгоритмом:
1)Знаходимо суми усіх діагоналей матриці
2)Визначаємо яка сума найбільша
3)Заміняємо кожний елемент діагоналей матриці на цю суму
Ось як вона буде виглядити за цею матрицею:

 5, 18,  7, 12,  3
 8,  6,  7,  9,  0
11,  2, 10,  1,  2
 4,  5, 15,  0, 12
 1, 13,  8,  6,  5

Находимо діагональ в якої найбільша сума елементів серед усіх діагоналей матриці.

18
    7
       1
          12
18 + 7 + 1 + 12 = 38

А тепер міняєм кожний елемент діагоналей матриці на те число яке вийшло.

38  38  38  38   3
38  38  38  38  38
38  38  38  38  38
38  38  38  38  38
 1  38  38  38  38

Я зараз не розумію тільки як проверстати кожну діагональ матриці задопомогою циклів в c++.

Подякували: leofun011

4 Востаннє редагувалося leofun01 (01.01.2019 20:16:25)

Re: Заміна елементів діагоналей в двовимірному масиві.

belo4ka1894 написав:
18
    7
       1
          12
18 + 7 + 1 + 12 = 38

А тепер міняєм кожний елемент діагоналей матриці на те число яке вийшло.

38  38  38  38   3
38  38  38  38  38
38  38  38  38  38
38  38  38  38  38
 1  38  38  38  38

А чому 1 і 3 залишились ?
Чи потрібно враховувати лише діагоналі з верхнього-лівого до нижнього-правого кута, які містять щонайменше 2 елементи ?

belo4ka1894 написав:

не розумію тільки як проверстати кожну діагональ матриці задопомогою циклів в c++.

З умови, яка є на даний момент :
Для масиву int **array з розміром [height][width]

int max = INT_MIN, sum;

for(int row = 0; row < height - 1; ++row) {
    sum = 0;
    for(int col = 0; col < width && row + col < height; ++col)
        sum += array[row][row + col];
    if(sum > max) max = sum;
}
for(int col = 1; col < width - 1; ++col) {
    sum = 0;
    for(int row = 0; row < height && row + col < width; ++row)
        sum += array[row + col][col];
    if(sum > max) max = sum;
}

for(int row = 0; row < height; ++row)
    for(int col = row; col < width && col < width + row - 1; ++col)
        array[row][col] = max;
for(int col = 0; col < width; ++col)
    for(int row = col + 1; row < height && row < height + col - 1; ++row)
        array[row][col] = max;

Але на всякий випадок пройдіться дебагером, бо я той код не перевіряв.