Минор матрицы с помощью статически-созданных массивов

Может у кого есть рабочий код/алгоритм, как вычислить, или хотя бы отделить минор матрицы(просто вычеркнуть лишние строки и столбцы) !максимальное внимание!Запрещено использовать указатели, динамические массивы, операторы new, delete, любые стандартные шаблоны stl, итераторы, контейнеры, библиотеки для обработки матриц. Если более кратко, только двумерные и не только массивы и ничего больше.


Ответы (1 шт):

Автор решения: Swift - Friday Pie

Логика цикла, пропускающего элементы

инициализация;
while( условие продолжения )
{
    if( надо пропустить итерацию? ) continue;
    // действия итерации
}

циклы for() и do-while работает так же. Для многомерных массивов вложенность цикла будет выше.

инициализация;
while( условие продолжения по строкам)
{
    if( надо пропустить итерацию? ) continue;
    // действия итерации
    инициализация;
    while( условие продолжения по столбцам )
    {
        if( надо пропустить итерацию? ) continue;
        // действия итерации
    }
}

В упрощенном случае, для копирования массива:

строка = столбец =  ист_строка = ист_столбец = 0;

while( ист_строка < число_строк_источника )
{
    if(ист_строка в списке пропускаемых ) {
      ист_строка += 1;
      continue;
    } 
    else 
    {
      while( ист_столбец меньше чем число_столбцов_источника )
      {
        if( ист_столбец в списке пропускаемых ) {
            ист_столбец += 1;
            continue;
        else {
           цель[строка][столбец] = источник[ист_строка][ист_столбец]
           ист_столбец += 1;
           столбец += 1;
        }
      }
      ист_строка += 1;
      строка += 1;
    }
}

По-моему нигде не ошибся. Тяжесть все это еще в том что проверка , пропускаем ли мы столбец или строку - тоже цикл. В виде функции желательно. "Облегчить" это можно введя статический массив с флагом в элементе, соответствующим пропускному столбцу или строке.

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

   //пропущены столбцы с индексами 2 и 4
   int столбцы[10] = { 0, 1, 3, 5, -1 }; 
   // взяты только строки с индексами 1 и 2
   int строки[10] = { 1, 2, -1 };  

Тогда цикл выглядит так

   // -1 является концом списка индексов.
   int ист_строка, ист_столбец;
   for(int строка = 0; (ист_строка = строки[строка]) != -1; ++строка )
   {
      for(int столбец = 0; (ист_столбец = столбцы[столбец]) != -1; ++столбец )
          цель[строка][столбец] = источник[ист_строка][ист_столбец]
   }

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

→ Ссылка