【问题标题】:Moving through each element of a (potentially non square) 2d array, diagonally沿对角线移动(可能是非正方形)二维数组的每个元素
【发布时间】:2021-03-04 03:59:48
【问题描述】:

我正在玩 c 中的二维数组,我想知道如何完全和对角地遍历二维数组。

水平方向,在维度矩阵width,height 你可以遍历每个索引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;
     }
}

我只是随机添加了一些东西,所以循环做了一些事情......但是,关键是我在正确的方向上遍历

垂直方向类似,但有一些翻转参数

然而对角线……我有点迷茫;我想不出一种以对角线方式穿越的方法。从概念上讲,我可能希望按以下顺序点击 4x3 矩阵:

 1  2  4  7
 3  5  8 10
 6  9 11 12

或者使用索引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

有没有一种直接的方法来点击这些元素(不一定按照每个说的顺序,但我认为对角递增会很有用)

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

【问题讨论】:

标签: arrays c traversal


【解决方案1】:

对于对角线遍历,只使用一个for 循环,因为ij 是相同的:

for (i = 0, i < min(width, hight), i++){
    // something to do with element[i][i]
}

【讨论】:

  • 这不是只穿过中间对角线吗?如何遍历非中间对角线?
  • @Johnnycode,也只有一个 for 循环。只需更改element[i][i] 中的第二个索引,例如1 从主对角线向上:element[i][i+1],次对角线(从右上到左下)element[i][n-i],其中n = min(width, hight)
【解决方案2】:

这是Traverse Matrix in diagonal strips 的副本,它在哪里提出了类似的建议:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2019-05-08
    相关资源
    最近更新 更多