2016-12-09 2 views
1

У меня проблема с управлением двумерной матрицей nxn в C++. Моя проблема заключается в создании функции, которая управляет, если существует какая-либо диагональная, параллельная линия на главной диагонали, которая обращена к другой. Я контролировал два индекса, необходимых для строк и столбцов, если они разные, и, возможно, я мог бы помочь мне с массивами поддержки, которые меняют элементы. Возможно, это не очень хорошая идея с огромной матрицей (например, 8x8, 14 массивов), поэтому я прошу вас о помощи.Как найти параллельное диагональное обратное в другой диагонали в матрице 2D в C++

Благодаря

an example with matrix 4x4

Это мой код:

bool funct(short **M, int rows, int columns){ 
bool found = false; 

for(int i = 0; i < rows; i++){ 
    for(int j = 0; j < colums; j++){ 

     if(i != j){ 
      //control the reverse array 
     } 
    } 
    } 
} 

пс: мой основной проблемой является общий алгоритм (пхп).

+0

Является ли матрица всегда квадратичной? Btw, 8x8 даже не около огромного. –

+0

Да, я еще не тренируюсь с матрицей. – Andrew

+0

Что вы подразумеваете под контролем. Вы просто хотите идентифицировать эти элементы в одной итерации через матрицу или вы хотите сказать, что хотите поместить все эти диагнозы в соответствующие массивы? –

ответ

1

В квадратичной матрице каждая диагональ имеет ровно одну другую диагональ с одинаковой длиной (кроме главной диагонали). Так что вам просто нужно проверить это:

for(int diagonal = 1; diagonal < cols - 1; ++diagonal) 
{ 
    //inspect the diagonal that starts at (0, diagonal) 
    //the other diagonal starts at (diagonal, 0) 
    int diagonalLength = cols - diagonal; 

    //Assume that this diagonal has a reverse counterpart 
    bool diagonalHasReverse = true; 

    //Now check if it really has 
    for(int i = 0; i < diagonalLength; ++i) 
    { 
     if(M[i][diagonal + i] != 
      M[diagonal + diagonalLength - 1 - i][diagonalLength - 1 - i]) 
     { 
      diagonalHasReverse = false; 
      break; 
     } 
    } 
    //do whatever you want with diagonalHasReverse 
} 

Внешний цикл не обрабатывает самый последний (один-элемент) по диагонали. Если вы хотите включить это, вам необходимо изменить петлю следующим образом:

for(int diagonal = 1; diagonal < cols; ++diagonal) 
+0

Разве это не диагональ

+0

@ Ahmed.J Почему? Последняя диагональ - это один элемент, который также может считаться обратной встречной частью. –

+0

Ну да, если это то, чего я хочу сказать из-за двух сверхсветовых диагоналей на изображении, а не из последнего элемента –

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