Как найти параллельную диагональную обратную сторону на другой диагонали в матрице 2D в С++

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

Спасибо

пример с матрицей 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
        }
    }
  }
}

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


person Andrew    schedule 09.12.2016    source источник
comment
Всегда ли матрица квадратична? Кстати, 8x8 даже рядом не огромный.   -  person Nico Schertler    schedule 09.12.2016
comment
Да, я еще не практикуюсь с матрицей.   -  person Andrew    schedule 09.12.2016
comment
Что вы имеете в виду под контролем. Вы просто хотите идентифицировать эти элементы за одну итерацию по матрице или, скажем, хотите поместить все эти диогналы в соответствующие массивы?   -  person Syed Ahmed Jamil    schedule 09.12.2016
comment
Я хочу только определить по крайней мере две диагонали, одна из которых обратна другой.   -  person Andrew    schedule 09.12.2016


Ответы (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)
person Nico Schertler    schedule 09.12.2016
comment
Разве это не должно быть диагональ ‹ cols -1 ? - person Syed Ahmed Jamil; 09.12.2016
comment
@ Ахмед.J Почему? Последняя диагональ представляет собой отдельный элемент, и ее также можно рассматривать как обратную часть. - person Nico Schertler; 09.12.2016
comment
Ну да, если это то, что нужно, я говорил из-за двух выделенных диагоналей на изображении, а не последнего элемента. - person Syed Ahmed Jamil; 09.12.2016
comment
Ты прав. Видимо, об этом говорят требования. Редактирование... - person Nico Schertler; 09.12.2016
comment
Если я хочу включить последний элемент (в моем примере это 3)? - person Andrew; 09.12.2016
comment
@Andrew Да, в этом случае вам нужно адаптировать цикл for. - person Nico Schertler; 09.12.2016
comment
Большое спасибо. - person Andrew; 09.12.2016