Обход 2D-массива, преобразованного в 1D, по диагонали

Я хочу пройти по квадратному 2D-массиву, который я преобразовал в 1D.

Проблема в том, что я хочу пройти по нему, как если бы я проходил исходное 2D по диагонали.

Массив диагональный, и я изначально создал его с помощью malloc в 1D, чтобы не выделять слишком много памяти.

Размер массива:

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);

И вот то, что я нашел для обхода массива диагональными полосами.

Для этого массива:

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

Можете ли вы предложить что-нибудь? Я застрял.


person guruste    schedule 10.04.2018    source источник
comment
если вы хотите просмотреть матрицу как двумерный массив, зачем вы вообще преобразовали ее в одномерную?   -  person Pablo    schedule 10.04.2018
comment
Я создал массив в 1D с помощью malloc, но хочу обращаться с ним так, как если бы это был диагональный массив. Я сделал это, потому что так я выделяю меньше памяти   -  person guruste    schedule 10.04.2018
comment
Где ты застрял? Что у вас есть до сих пор?   -  person Mad Physicist    schedule 10.04.2018
comment
Что вы подразумеваете под обходом по диагонали? Можете показать схему обхода? диагональ обычно означает главную диагональ...   -  person Mad Physicist    schedule 10.04.2018
comment
Я создал массив в 1D, используя malloc --> опубликуйте этот код.   -  person chux - Reinstate Monica    schedule 10.04.2018


Ответы (2)


То, что вы описываете, когда говорите, что выделили двумерный массив как одномерный массив, называется выравниванием массива. Сведение массивов на самом деле является общепринятой практикой обеспечения безопасности, поскольку структура массива сама по себе дает много информации, поэтому код запутан, чтобы смягчить это. Даже сам процесс управления программой будет замаскирован для дополнительной безопасности.

Чтобы пройти по диагонали гипотетической матрицы 3x3, сглаженной в одномерный массив размером 9, вы можете начать с arr[0] и просто добавить 4 к смещению. Этот метод по существу изоморфен для итерации по диагонали матрицы от левого верхнего угла к правому нижнему, обеспечивая при этом некоторую дополнительную секретность, поскольку вывести структуру данных не так просто.

Вы можете визуализировать это преобразование так:

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

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

Итак, когда вы выполняете итерацию по первому массиву, вы вкладываете два цикла for, сообщая о том, что это двумерный массив. С другой стороны, при повторении второго массива путем увеличения индекса на 4, начиная с 0, вы будете получать доступ к тем же элементам, что и в первом массиве, но вы делаете это, не раскрывая основную структуру данные.

Этот надуманный пример слишком тривиален для практического использования, но я призываю вас изучить его. Дайте знать, если у вас появятся вопросы.

person Jose Fernando Lopez Fernandez    schedule 10.04.2018
comment
Никогда не слышал, чтобы это было мерой безопасности: не могли бы вы предоставить надежный источник? Вы добавляете 4 к смещению, а не 3. - person Mad Physicist; 10.04.2018
comment
Конечно, я отредактирую, дайте мне секунду. Не знаю, зачем добавлять 4 к смещению, тогда вы получите доступ к arr[0], arr[4] и arr[8]. Вы имели в виду что-то другое? Если вы добавите три, вы получите элементы 0, 3 и 6, которые соответствуют первой строке, первому столбцу, второму столбцу второй строки и третьему столбцу третьей строки. - person Jose Fernando Lopez Fernandez; 10.04.2018
comment
ОП просит диагональ - person Mad Physicist; 10.04.2018
comment
Верно, я дал ему диагональ, заданную элементами [0][0], [1][1], [2][2]. - person Jose Fernando Lopez Fernandez; 10.04.2018
comment
Ах, да, я только что понял, что вы говорите - person Jose Fernando Lopez Fernandez; 10.04.2018
comment
Вот почему я проголосовал за закрытие вопроса вместо того, чтобы отвечать самому себе. Не совсем понятно, чего хочет ОП. - person Mad Physicist; 10.04.2018
comment
Не могу поверить, что мне понадобился час, чтобы понять, что я даю первую колонку. Мне нужно идти спать. Извините за это, спасибо за голову - person Jose Fernando Lopez Fernandez; 10.04.2018

Что-то вроде этого?

#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]);
}
person purec    schedule 10.04.2018
comment
При чем тут диагональ? - person Mad Physicist; 10.04.2018
comment
В printf(%d, обр[i]); - person purec; 10.04.2018
comment
Я не могу сегодня читать, видимо. Моя ошибка. Я прочитал приращение как i += n. - person Mad Physicist; 10.04.2018