2013-03-23 5 views
1

Я хотел бы обработать каждую граничную ячейку матрицы nxn. Например, для int array [5] [5]; алгоритм должен обрабатывать каждый х элемент, поэтому он имеет формуОбработка граничных ячеек матрицы

x x x x x 
    x - - - x 
    x - - - x 
    x - - - x 
    x x x x x 

Какой самый лучший способ обработки этой клетки? А если это трехмерный массив? Спасибо заранее, и извините за матричное представление.

Редактировать I Я бы хотел использовать только один цикл, чтобы избежать циклов вложения или рекурсии.

+2

C++ или C? Есть разница, которую вы знаете. –

+0

@ Magtheridon96 Я бы предпочел код C, так как я не буду использовать библиотеку std, но я знаю оба, поэтому это не проблема. – 2013-03-23 16:37:54

+0

Хотите ли вы, чтобы это работало для любой матрицы NxN, или вам нужны конкретные измерения? (Специфические размеры упростили бы решение) –

ответ

-1

Вы в основном хотите обрабатывать случаи, когда index == 0 и index == size для каждого измерения в вашем массиве. Предполагая, что process() является вашей функцией обработки и принимает аргумент int.

void processNXNBorders(int** twoDArray, int dimonesize, int dimtwosize) { 
    for (int i = 0; i < dimonesize; i++) { 
     if (i == 0 || i == dimonesize-1) { 
      // Process entire row 
      for (int j = 0; j < dimtwosize; j++) { 
       process(twoDArray[i][j]); 
      } 
     } else { 
      // Only first and last elements in this row. 
      process(twoDArray[i][0]); 
      process(twoDArray[i][dimtwosize-1]); 
     } 
    } 
} 

Таким образом, для массива 5х5, то вызов будет:

processNXNBorders(arr, 5, 5); 
+0

Сначала 'if' должен быть i == dimonesize-1 или i <= dimonesize сначала 'for', right ?. Спасибо за ответ, но есть ли способ обработать границы без вложенных циклов? – 2013-03-23 16:48:21

+0

@BenWard Да, моя ошибка. Рекурсивное решение этой проблемы также решается, но рекурсия и итерация - это всего лишь два разных способа сделать то же самое. – Tushar

+0

Правильно, но я хотел бы итеративно определить компоненты пограничных ячеек без вложенных циклов и рекурсии. Например, функция, возвращающая компоненты i, j, заданная числом от 1 до 4 * dim-1, чтобы избежать вложенных циклов. – 2013-03-23 16:55:33

1

Представьте прикасаясь каждый элемент имеет свою цену, и вы хотите коснуться только пограничные элементы.

Очевидно, что это не общая оптимизация. Но у меня была хорошая производительность при обработке изображений. Я имею в виду, это зависит, проверьте его в своем случае и решите.

В 2D-массивах вы можете сделать ptr точек на матрицу и постепенно прогрессировать.

void process(char i) 
{ 
    cout << i; 
} 

int main() 
{ 
    const int N = 5; 
    char mat[N][N] = { 
     {'a', 'b', 'c', 'd', 'e'}, 
     {'f', '-', '-', '-', 'g'}, 
     {'h', '-', '-', '-', 'i'}, 
     {'j', '-', '-', '-', 'k'}, 
     {'l', 'm', 'n', 'o', 'p'} 
    }; 

    char *ptr = (char*) mat; 

    for (int i = 0; i < N - 1; ++i) // Process first row 
     process(*ptr++); 

    for (int i = 0; i < N - 2; ++i) // Process column borders 
    { 
     process(*ptr); 
     process(*(ptr + 1)); 
     ptr += N; 
    } 

    for (int i = 0; i <= N; ++i) // Process last row 
     process(*ptr++); 

    cout << endl; 
} 

Выход:

ABCDEFGHIJKLMNOP

+0

Спасибо. Я уже думал об этом способе обработки этих ячеек. Является ли это более эффективным, чем использование только цикла и определения компонентов пограничных ячеек, как я объяснил в ответе Тушара? – 2013-03-23 17:15:59

Смежные вопросы