2017-02-07 3 views
-1

Мне нужна помощь в решении этой проблемы. Дано 2d массив:Как перемещаться по двумерному массиву в обратной диагонали?

1 2 3 4 
5 6 7 8 
9 10 11 12 

Как я пишу петли, так что я могу напечатать в следующем порядке:

9, 5 10, 1 6 11, 2 7 12, 3 8, 4? 
+6

Try и потерпеть неудачу. В этом нет вреда. Голосование закрывается. – nullpointer

+0

Пробовал, но не мог понять. – b0sss

+0

это не так уж сложно выяснить, у него есть простое решение. –

ответ

1

Нам нужны два шага для обхода 2D массива.

  1. обходе левый нижний часть матрицы.
  2. Обход правый верхний часть матрицы.

Тогда мы должны заботиться о том, как пройти обратную диагональ.

  1. Чтобы найти взаимосвязь индекса между предыдущим элементом массива и последующим элементом массива.
  2. Обобщение функции между индексом элемента и значением.
  3. Использование для цикла для перемещения.

код в C здесь:

#include<stdio.h> 

int main(void){ 
    int row = 3; 
    int col = 4; 
    int arr[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 
    int i,j; 
    for(i=row-1; i>=0; i--){ 
     int tmpRow = i; 
     int tmpCol= 0; 
     while(tmpRow<row){ 
      printf("%d ", arr[tmpRow][tmpCol]); 
      tmpCol++; 
      tmpRow++; 
     } 
    } 
    for(i=1; i<col; i++){ 
     int tmpCol = i; 
     int tmpRow = 0; 
     while(tmpCol<col){ 
      printf("%d ", arr[tmpRow][tmpCol]); 
      tmpCol++; 
      tmpRow++; 
     } 
    } 
    return 0; 
} 

Результат здесь: enter image description here

ONE LOOP:

int main(void){ 
    int row = 3; 
    int col = 4; 
    int arr[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 
    int i,j; 

    //number of reverse diagonal 
    int tripNum = row + col - 1; 
    int firstRowIndex = row - tripNum; 
    for(i=row-1; i>=firstRowIndex; i--){ 
     int tmpRow = i; 
     int tmpCol= 0; 
     while(tmpRow<row && tmpCol<col){ 
      if(tmpRow<0){ 
       tmpCol++; 
       tmpRow++; 
       continue; 
      }else{ 
       printf("%d ", arr[tmpRow][tmpCol]); 
       tmpCol++; 
       tmpRow++; 
      } 
     } 
    } 

    return 0; 
} 
+0

Возможно ли это сделать в одной функции? – b0sss

+0

Вы можете уверенно инкапсулировать функцию, чтобы функция взяла один параметр, который является целым массивом 2D. –

+0

Счастье я имел в виду. вместо выполнения 2x для цикла. Возможно, чтобы он проходил один раз снизу вверх, вместо того, чтобы делать верхнюю половину и нижнюю половину? – b0sss

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