Случайно натолкнулся на этот кусок – резанул глаз выход из середины цикла for. После прочтения комментария, понял, что задача хорошо подходит в качестве этюда при обучении – простая, но нужно подумать.
Речь идет о пошаговом обходе многомерного массива. Программа выполняет один шаг – увеличивает текущую комбинацию индексов, начиная с последнего. Если отобразить этот массив на одномерный, то все, что нужно - увеличить его индекс на 1, пока не зайдем за верхнюю границу, тогда _complete = true. Если потом обратно пересчитать одномерный индекс в комбинацию многомерных, то получим ответ.
Границы размерностей задаются функциями array.GetUpperBound(номер размерности)и GetLowerBound, последняя не обязательно равна нулю. Но это не принципиально.
Вот как решили это в Microsoft (C#).
## Код:
```
private void IncArray() {
  // This method advances us to the next valid array index,
  // handling all the multiple dimension & bounds correctly.
  // Think of it like an odometer in your car - we start with
  // the last digit, increment it, and check for rollover.  If
  // it rolls over, we set all digits to the right and including 
  // the current to the appropriate lower bound.  Do these overflow
  // checks for each dimension, and if the most significant digit 
  // has rolled over it's upper bound, we're done.
  //
  int rank = array.Rank;
  _indices[rank - 1]++;
  for (int dim = rank - 1; dim >= 0; dim--) {
    if (_indices[dim] > array.GetUpperBound(dim)) {
      if (dim == 0) {
        _complete = true;
        break;
      }
      for (int j = dim; j < rank; j++)
        _indices[j] = array.GetLowerBound(j);
      _indices[dim - 1]++;
    }
  }
}
```
Предлагаю дать свои решения. Главное, конечно, описать ход решения или инструмент. Кстати, подозреваю, что решение красиво выглядит на ФЯ, было бы интересно его посмотреть.
Свой вариант прилагаю в запароленном виде.