1

Тема: Обхід двовимірної матриці відносно побічної діагоналі

Потрібно зібрати всі елементи, які знаходяться на побічній діагоналі квадратної матриці та менших паралельних до неї діагоналях.
Тобто, якщо матриця була:

std::vector<std::vector<char>> tablet {
        { 'P', 'A', 'R', 'T' },
        { 'A', 'G', 'A', 'R' },
        { 'R', 'A', 'G', 'A' },
        { 'T', 'R', 'A', 'M' }
    };

То вивід має бути: T, RR, AAA, PGGM, AAA, RR, T.

Для головної діагоналі зробив ось так:

for (int i = 0; i < 2 * row_size - 1; ++i) {
        std::string diag_line { "" };
        int start_col = (i < row_size) ? 0 : i - row_size + 1;
        for (int j = start_col; j <= i - start_col; ++j) {
            diag_line += tablet.at(j).at(i - j);
        }
    }

Розумію, що стовпці треба зменшувати, але застряг на формулі початкового стовпця.

2

Re: Обхід двовимірної матриці відносно побічної діагоналі

https://uk.wikipedia.org/wiki/Головна_діагональ

3

Re: Обхід двовимірної матриці відносно побічної діагоналі

koala написав:

https://uk.wikipedia.org/wiki/Головна_діагональ

Так, навпаки виходить, треба паралельно головній діагоналі.

4 Востаннє редагувалося koala (12.08.2024 14:33:19)

Re: Обхід двовимірної матриці відносно побічної діагоналі

А ви як хочете? Щоб початковий стовпчик починався з нулів? Ну тобто для row_size == 4 було 0, 0, 0, 0, 1, 2, 3?

5

Re: Обхід двовимірної матриці відносно побічної діагоналі

koala написав:

А ви як хочете? Щоб початковий стовпчик починався з нулів? Ну тобто для row_size == 4 було 0, 0, 0, 0, 1, 2, 3?

Мені треба спочатку елемент у (1 рядок, 4 стовпчик), потім два елементи (2, 4) і (1, 3), тоді (3, 4), (2, 3), (1, 2) і так далі.
Доки не зберу головну діагональ і паралельні до неї.

6

Re: Обхід двовимірної матриці відносно побічної діагоналі

Ви чомусь хочете починати знизу? Ну тобто стартові будуть (1, 4), (2, 4), (3, 4), (4, 4), (4, 3), (4, 2), (4, 1). І ще мінус один, щоб з нуля. Правильно?

start_row = i<row_size ? i : row_size-1;
start_col = i<row_size ? row_size-1 : 2*row_size-i-2;

7

Re: Обхід двовимірної матриці відносно побічної діагоналі

koala написав:

Ви чомусь хочете починати знизу? Ну тобто стартові будуть (1, 4), (2, 4), (3, 4), (4, 4), (4, 3), (4, 2), (4, 1). І ще мінус один, щоб з нуля. Правильно?

start_row = i<row_size ? i : row_size-1;
start_col = i<row_size ? row_size-1 : 2*row_size-i-2;

Нарешті розібрався що до чого. Ось те, що мені було треба:

for (int i = 0; i < 2 * row_size - 1; ++i) {

        std::string add_diag_line { "" };
        int start_col = (i < row_size) ? row_size - i - 1 : 0;
        int start_row = (i < row_size) ? row_size - i - 1 : row_size - i - 1;
        
        for (int j = start_col; j < 2 * row_size - i - 1 - start_col; ++j) {
            add_diag_line += tablet.at(j - start_row).at(j);
        }
    }

Це, до речі, частина рішення для завдання Is sator square? з Codewars.
Саме завдання просте, але змушує глибше зануритися в механіку матриць.
Доволі повчальна річ для новачка.