Поиск оптимальных ходов сокращения строк в C

#c

#c

Вопрос:

Для этой проблемы временная сложность не имеет значения. Я уже создал функцию, которая может выполнять операции со строками над матрицей. Я попытался сделать это способом «bash»:

 void recursionfordataset(int range, std::vector<std::vector<int>> Dummy) {
  if (counter != 0) {
    for (int x = -range; x <= range; x  ) {
      for (int y = -range; y <= range; y  ) {
        for (int i = 0; i < 2; i  ) {
          for (int j = 0; j < 2; j  ) {
            if (i != j) {
              Dummy = add(Dummy[i], Dummy[j], Dummy, i, x, y);
              std::vector<int> move = {x, y};
              Moves.push_back(move);
              counter -= 1;
              recursionfordataset(range, Dummy);
              if (x!=0 amp;amp; y!=0){
              Dummy = add(Dummy[i],Dummy[j], Dummy, i, 1/x, 1/y);
              }
              recursionfordataset(range, Dummy);
            }
          }
        }
      }
    }
  } else {
    bool yesno = TestIfIdentity(Dummy);
    if (yesno == true) {
      return;
    } else {
      Moves.clear();
      counter = 9;
      recursionfordataset(range, Dummy);
    }
  }
}

 

По сути, это перебирает все возможные комбинации операций со строками в определенном диапазоне. Функция add принимает параметры (первая строка, вторая строка, индекс первой строки, константа1, константа2), где изменение происходит с первой строкой, и оно равно constant1 x первая строка constant2 x вторая строка.

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

Я подумываю об использовании другого метода, кто-нибудь знает способ сделать это без «bash»? Любая помощь приветствуется.

Комментарии:

1. Не могли бы вы объяснить, что должен делать этот код? Шаги по сокращению строк мне непонятны…

2. 1/x и 1/y большую часть времени будет равен нулю. Они также приведут к ошибке деления на ноль.

3. Извините за ошибку деления на ноль, просто исправлено. Он по-прежнему вылетает. @Damien, смотри en.wikipedia.org/wiki/Gaussian_elimination .

4. Код сложный, в том числе для людей, которые знают, что такое исключение по Гауссу. Добавление некоторых комментариев может помочь сделать его менее загадочным.