我需要完成与此处相同的事情,但要适用于任何矩阵,而不仅仅是方形矩阵。而且遍历的方向需要相反。我尝试编辑我在那里找到的代码,但无法弄清楚。
谢谢。
我记得我写过那个。我想对于一个矩形矩阵,你需要做一些小改动以及加上一行难以理解的废话:
#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个切片从零开始,并逐渐增加一。
x[m - j - 1][slice - j]
而不是x[j][slice - j]
。这将给出[9],[10,5],[11,6,1]等。这符合您的要求吗? - Mark Byers