以对角线条形式遍历矩形矩阵

11
我需要完成与此处相同的事情,但要适用于任何矩阵,而不仅仅是方形矩阵。而且遍历的方向需要相反。我尝试编辑我在那里找到的代码,但无法弄清楚。

谢谢。

1个回答

23

我记得我写过那个。我想对于一个矩形矩阵,你需要做一些小改动以及加上一行难以理解的废话:

#include <stdio.h>

int main()
{
    int x[3][4] = { 1,  2,  3,  4,
                    5,  6,  7,  8,
                    9, 10, 11, 12};
    int m = 3;
    int n = 4;
    for (int slice = 0; slice < m + n - 1; ++slice) {
        printf("Slice %d: ", slice);
        int z1 = slice < n ? 0 : slice - n + 1;
        int z2 = slice < m ? 0 : slice - m + 1;
        for (int j = slice - z2; j >= z1; --j) {
                printf("%d ", x[j][slice - j]);
        }
        printf("\n");
    }
    return 0;
}

输出:

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

简要解释一下它的工作原理,每个切片都是从第一列开始的对角线,向右上方对角线延伸,最后停在第一行(最初是向下左方的,但由于评论者的评论而被交换了)。

z2表示在第一个数字打印之前必须跳过多少项。对于前m个切片,这是零,然后对于剩余的每个切片,它会增加一。z1表示在结束时应该跳过多少项,同样对于前m个切片从零开始,并逐渐增加一。


是的,那就是我想要的。但是…… 实际上我需要的是对矩形矩阵进行反对角线遍历。 :) 我尝试交换你在方阵中给出的答案中的索引,以为我可以应用相同的原理 - 只需交换索引即可获得反对角线遍历。 但是,对于矩形矩阵,它行不通。 那么,现在我应该问一个关于反对角线矩形遍历的问题吗? 谢谢您的回答 :) - misaizdaleka
1
我不完全确定您所说的“反对角线”是什么意思。更新您的问题会更有帮助。我认为您需要做的是在读取数组值时翻转y坐标,但保持x不变,即使用x[m - j - 1][slice - j]而不是x[j][slice - j]。这将给出[9],[10,5],[11,6,1]等。这符合您的要求吗? - Mark Byers
对不起,我又犯错了... 我没有表达清楚。不,我需要相同的遍历,但不是像[1],[2,5],[3,6,9]这样进行,而是像[1],[5,2],[9,6,3]等进行。再次感谢。 - misaizdaleka
非常感谢您。您刚刚帮我省去了写6个嵌套的for循环的麻烦。 :) 我需要这两种模式。是的,找到这个线程有点困难,但这样做是值得的。 - Darshan Pandit
1
只是为了完善这个答案,您如何遍历逆对角线? - elios264
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接