Как можно пройти через весь двумерный массив за один цикл?
например
Я хочу 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): три звезды
и так далее…
нота буфер является строкой.
Если вы хотите получить все диагональные элементы, 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].Для массива 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
будучи диагональю в правом нижнем углу.