Цикл по диагонали через 2D массив в одном цикле

Как можно пройти через весь двумерный массив за один цикл?
например

Я хочу push_back диагональные элементы в буфер для обработки: от 2 до 2, от 3 до 3, от 4 до 4
Я попытался сделать это в двух отдельных циклах, но потом не могу их обработать вместе.

Пример 2D-массива:

0 1 2 3 4 5 6
1 * * * * * *
2 * * * * * *
3 * * * * * *
4 * * * * * *
5 * * * * * *
6 * * * * * *

Таким образом, буфер для (0,1) — (1,0) будет: одна звезда из сетки

буфер для (0,2) — (2,0): две звезды

буфер для (0,3) — (3,0): три звезды

и так далее…

нота буфер является строкой.

1

Решение

Если вы хотите получить все диагональные элементы, for цикл будет выглядеть примерно так:

for(unsigned int i=0;i<yourArrayWidth;i++)
yourSum += yourArray[i][i];

если вы хотите, чтобы числа были сверху-слева-внизу-справа (так «\»), или:

for(unsigned int i=0;i<yourArrayWidth;i++)
yourSum += yourArray[yourArrayWidth-i][i];

если вы хотите, чтобы числа были сверху справа внизу слева (поэтому «/»).

Куда:

  • yourSum это какой-то буфер, который вы инициализируете перед обходом.
  • yourArrayWidth это ширина массива.
  • yourArray 2D-массив в вашем примере, начинающийся с [0] [0].
0

Другие решения

Для массива M строки и N столбцы, вы бы num=N+M-1 диагонали, каждая из которых может быть получена через:

int num = N+M-1;
int len = 1;
std::vector<std::string> res;
for (int i=0; i<num; ++i)
{
int startRow = std::min(i, M-1);
int startCol = i-startRow;
int len      = std::min(startRow, N-1-startCol) + 1;
std::string str(len, '\0');
for (int j=0; j<len; ++j)
{
str[j] = arr[startRow-j][startCol+j];
}
res.push_back(str);
}

с i=0 будучи диагональю «/» в верхнем левом углу, и i=N+M-1 будучи диагональю в правом нижнем углу.

0

По вопросам рекламы [email protected]