2010-01-21 95 views
9

我需要做同样的事情here,但要使用任何矩阵,而不仅仅是一个矩形矩阵。而且,遍历的方向需要相反。我试图编辑我在那里找到的代码,但无法弄清楚。对角线条纹中的矩形矩阵

谢谢。

回答

22

我记得写这个。我觉得对于一个矩形矩阵你需要一些小的改动和一个多线难以理解的废话:

#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个切片为零,然后对于每个剩余切片增加1个。 z1是最后应该跳过多少项目,再次从头开始m片开始为0,剩下的片开始增加1。

+0

是的,这就是我想要的。但是... 我真正需要的是反对角条中的横向矩形矩阵。 :)我试着在给出的矩阵矩阵的答案中交换指数,我认为我可以在这里应用相同的原则 - 交换指数,并获得反对角线遍历。但是,对于矩形矩阵它不起作用。那么,我现在应该问一个更多的问题来进行反对角矩形遍历吗? 感谢您的回答:) – misaizdaleka 2010-01-21 21:38:51

+1

我不完全确定你的意思是反对角线。更新你的问题会有所帮助。我认为当你读取数组值时,你需要做的是翻转y坐标,但是保持x不变,即'x [m-j-1] [slice -j]'而不是'x [j] [slice - J]'。这给了[9],[10,5],[11,6,1]等......这就是你想要的吗? – 2010-01-21 21:43:53

+0

对不起,我的错误再次......我不是很确切。不,我需要相同的遍历,但不会像[1],[2,5],[3,6,9],但像[1],[5,2],[9,6,3],再次感谢。 – misaizdaleka 2010-01-21 21:46:44