Arrays 在(可能是非正方形的)二维阵列的每个元素中沿对角线移动

Arrays 在(可能是非正方形的)二维阵列的每个元素中沿对角线移动,arrays,c,traversal,Arrays,C,Traversal,我在玩c语言中的2d数组,我想知道如何完全和对角地遍历2d数组 水平方向,在尺寸矩阵中宽度,高度 您只需移动每个索引i,并检查索引j 比如: const int width = 10; const int height = 10; const int mat[width][height] = {0}; for (i = 0, i<width, i++){ for (j = 0; j<height; j++){ mat[i][0] = j; } }

我在玩c语言中的2d数组,我想知道如何完全和对角地遍历2d数组

水平方向,在尺寸矩阵中
宽度
高度
您只需移动每个索引
i
,并检查索引
j

比如:

const int width = 10;
const int height = 10;
const int mat[width][height] = {0};
for (i = 0, i<width, i++){
     for (j = 0; j<height; j++){
         mat[i][0] = j;
     }
}
或使用索引
i,j

0,0 -> 
1,0 -> 0,1 -> 
2,0 -> 1,1 -> 0,2 -> 
2,1 -> 1,2 -> 0,3 ->
2,2 -> 1,3 ->
2,3

是否有一种直接的方法来命中这些元素(不一定是按照每个元素的顺序,但我认为对角线递增会很有用)


此外,是否可以检查相反方向的对角线?

对于对角线遍历,对于回路,仅使用一个
,因为
i
j
是相同的:

for (i = 0, i < min(width, hight), i++){
    // something to do with element[i][i]
}
for(i=0,i
这是建议的位置的副本,类似于:

int main(void)
{
    int m[3][4] = { 1, 2, 4, 7,
                    3, 5, 8,10,
                    6, 9,11,12 };

    const int h = 3; /* height*/
    const int w = 4; /* width */
    for (int diag = 0; diag < (w + h - 1); ++diag)
    {
        printf("diag %d:",diag);
        int i_start = diag < w ? 0 : diag - w + 1;
        int i_end = diag < h ? diag + 1 : h;
        for (int i = i_start; i < i_end; ++i)
        {
            printf("%d ",m[i][diag - i]);
        }
        printf("\n");
    }
    return 0;
}

用于(int i=0;i在向stackoverflow发布问题之前,您应该腾出所有人的时间,检查主题上已经存在的问题和答案:,这是否回答了您的问题?这不是只穿过中间对角线吗?如何穿过非中间对角线?@johnycode,也只有一个
for
循环。Just更改
元素[i][i]
中的第二个索引,例如从主对角线向上1:
元素[i][i+1]
,次对角线(从右上到左下)
元素[i][n-i]
,其中
n=min(宽度、高度)
int main(void)
{
    int m[3][4] = { 1, 2, 4, 7,
                    3, 5, 8,10,
                    6, 9,11,12 };

    const int h = 3; /* height*/
    const int w = 4; /* width */
    for (int diag = 0; diag < (w + h - 1); ++diag)
    {
        printf("diag %d:",diag);
        int i_start = diag < w ? 0 : diag - w + 1;
        int i_end = diag < h ? diag + 1 : h;
        for (int i = i_start; i < i_end; ++i)
        {
            printf("%d ",m[i][diag - i]);
        }
        printf("\n");
    }
    return 0;
}
diag 0:1
diag 1:2 3
diag 2:4 5 6
diag 3:7 8 9
diag 4:10 11
diag 5:12