遍历转换为1D的2D数组,对角线

时间:2018-04-10 17:37:00

标签: c diagonal

我想遍历我已转换为1D的2D方阵。

问题在于我想要遍历它,就好像我在对角线条中穿越原始2D一样。

数组是对角线的,我最初用1D中的malloc创建它,以避免分配太多内存。

数组的大小:

int Tsize = N*(N+1)/2; //table size -> diagonal array of (N+1)*N/2 elements

int* table = malloc(Tsize*sizeof(int)); 

我知道你通过这种方式遍历一个扁平的2D阵列。

do{
    i = row*N + col;
    col++;
    if (col>N-1){
        col = 0;
        row++;
    }
    printf("%d ", x[i]);
} while( row < N);

我发现here是在对角线条中遍历数组。

对于这个数组:

int x[3][3] = {1, 2, 3,
               ø, 4, 5,
               ø, ø, 6};

ø:我不会使用那个元素。

我创建了这个数组:

int k[6] = {1,2,3,4,5,6};

我希望像那样遍历它:

1,4,6,2,5,3

你能提出什么建议吗?我被卡住了。

2 个答案:

答案 0 :(得分:0)

当您说将二维数组分配为一维数组时,您所描述的内容称为数组展平。展平数组实际上是一种常见的安全措施,因为the structure of an array gives you a lot of information on its own,因此对代码进行了模糊处理以减轻这种影响。即使the program's control flow itself也会被混淆以获得额外的安全性。

要将一个假想的3x3矩阵对角线移动到一个大小为9的一维数组中,您可以从arr[0]开始,只需将4加到偏移处即可。这个方法是essentially isomorphic从左上角到右下角迭代矩阵对角线,同时提供一些额外的保密,因为it's not as trivial to deduce the structure of the data

您可以像这样可视化此转换:

  a [0] [1] [2]
    [3] [4] [5]
    [6] [7] [8]

  b [0] [1] [2] [3] [4] [5] [6] [7] [8]

因此,当您遍历第一个数组时,您将嵌套两个for循环,并传达这是一个二维数组的事实。另一方面,当通过从0开始将索引递增4来迭代第二个数组时,您将访问与第一个数组中相同的元素,但是您正在执行它而不会泄露底层结构数据。

这个人为的例子对于实际使用来说太微不足道了,但我鼓励你研究一下。如果您有任何问题,请告诉我。

答案 1 :(得分:0)

这样的东西?

#include <stdio.h>
#include <stdlib.h>

int
main() {
 int i, n = 5;
 int *arr = malloc(n*n*sizeof(int));
 for (i = 0; i < n*n; i++)
    arr[i] = i + 1;
 for (i = 0; i < n*n; i += n+1) 
    printf("%d ", arr[i]);
}