2016-03-16 2 views
1

Это должен быть довольно прямолинейный вопрос, но я не могу понять, как получить все диагонали не квадратной матрицы.Диагональные линии в массиве NonSquare

У меня уже есть то, что я считаю антидиагоналями (примеры на: https://stackoverflow.com/a/33769730), но мне также нужны противоположные диагональные линии.

Пример массив:

1 2 3 4 

5 6 7 8 

9 10 11 12 

Токовый выход:

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

Ожидаемый дополнительный выход:

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

Я ищу больше для псевдокода, так что я могу понять это лучше.

EDIT: Код я должен получить анти-диагоналей (поскольку ни один не кажется, хочет следовать по ссылке)

int ndiags = width + height - 1; 
System.out.println("---"); 
for (int diag = 0; diag < ndiags; diag++) { 
    int row_stop = Math.max(0, diag - width + 1); 
    int row_start = Math.min(diag, height - 1); 
    for (int row = row_start; row >= row_stop; row--) { 
     // on a given diagonal row + col = constant "diag" 
     // diag labels the diagonal number 
     int col = diag - row; 
     System.out.println(col + "," + row); 
     relax(col, row); 
    } 
    System.out.println("---"); 
} 

Я попытался следующие, но я до сих пор только получение анти-диагоналей:

int ndiags = width + height - 1; 
System.out.println("---"); 
for (int diag = 0; diag < ndiags; diag++) { 
    int row_stop = Math.max(0, diag - height + 1); 
    int row_start = Math.min(diag, width - 1); 
    for (int row = row_start; row >= row_stop; row--) { 
     // on a given diagonal row + col = constant "diag" 
     // diag labels the diagonal number 
     int col = diag - row; 
     System.out.println(col + "," + row); 
     relax(col, row); 
    } 
    System.out.println("---"); 
} 
+1

сообщение, что у вас уже есть. Кроме того, это Java или C#? – Tunaki

+0

Не имеет значения, что - я могу перевести между двумя – redhotspike

+0

Тем не менее, вы говорите в своем вопросе, что у вас уже есть что-то. Не могли бы вы опубликовать его и сказать, что с ним не так? – Tunaki

ответ

1

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

: [4 ] [3 8 ] [2 7 12 ] [5 10 ] [9 ]

class Diagonal 
{ 
    public static void main(String[] args) 
    { 
     int r=3,c=4; 
     int Mat[][]={{1,2,3,4},{5, 6 ,7 ,8},{9,10,11,12}}; 

     int x,y; 
     for(int i=c-1;i>0;i--) 
     { 
      y=i;x=0; 
      System.out.print("["); 
      while(y<c) 
      { 
       System.out.print(Mat[x][y]+" "); 
       x++;y++; 
      } 
      System.out.print("] "); 
     } 

     for(int i=1;i<r;i++) 
     { 
      x=i;y=0; 
      System.out.print("["); 
      while(x<r) 
      { 
       System.out.print(Mat[x][y]+" "); 
       x++;y++; 
      } 
      System.out.print("] "); 
     } 

    } 
} 

Для анти-диагональной:

выход: [1 ] [2 5 ] [3 6 9 ] [4 7 10 ] [8 11 ] [12 ]

class Diagonal 
{ 
    public static void main(String[] args) 
    { 
     int r=3,c=4; 
     int Mat[][]={{1,2,3,4},{5, 6 ,7 ,8},{9,10,11,12}}; 
     int x,y; 
     for(int i=0;i<c;i++) 
     { 
      y=i;x=0; 
      System.out.print("["); 
      while(y>=0 && x<r) 
      { 
       System.out.print(Mat[x][y]+" "); 
       x++;y--; 
      } 
      System.out.print("] "); 
     } 

     for(int i=1;i<r;i++) 
     { 
      x=i;y=c-1; 
      System.out.print("["); 
      while(x<r) 
      { 
       System.out.print(Mat[x][y]+" "); 
       x++;y--; 
      } 
      System.out.print("] "); 
     } 

    } 
} 
+0

Это именно то, что я пытался спросить! – redhotspike

+1

Если вы меняете 'for (int i = 1; i redhotspike

1

Каждый диагонали, идущей в верхнем левом углу, чтобы нижний правый направлении определяется значением j - i, где i представляет собой номер строки и j является номер столбца. Обратите внимание, что некоторые идентификаторы могут быть отрицательными.

Так псевдокод может выглядеть так:

  • Создать словарь с int ключей и Linst<int> значений.
  • Итерации по каждому элементу массива.
  • Добавить текущий элемент в список, обозначенный j - i Значение из словаря.

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

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

Вы могли бы показать пример того, как может выглядеть список?

Словарь может выглядеть следующим образом:

keys: -2 -1 0 1 2 3 
------------------------------- 
lists: 9 5 1 2 3 4 
      10 6 7 8 
       11 12 

Список элементов визуализируются сверху вниз.

+0

У меня возникли проблемы с визуализацией этого (возможно, потому, что я так долго смотрел на 2D): не могли бы вы показать пример того, как выглядит список? – redhotspike

+0

Мне действительно нравится это решение - это выходит за рамки моего первоначального вопроса, но вы думаете, что он будет работать и для 3D-массива? – redhotspike

+1

Да, он может быть применен к 3D. Однако диагонали будут представлены поверхностями для 3D-матрицы. Будет 3 направления. –

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