Интеллектуальный метод для конкретного обхода матрицы - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно пройти по матрице n x n в java (поэтому индексы 0, ..., n-1), чтобы присвоить значения отдельным элементам. Я должен начать с нижнего правого и прибыть в верхний левый. Особенность в том, что мне не нужно учитывать элемент matrix[n-1][n-1], который был инициализирован ранее. Смежные значения зависят друг от друга для инициализации, и он должен быть инициализирован первым.

Одним из способов может быть вставка if в цикл for

for (i = n-1; i >= 0; i--)
  for (j = n-1; j >= 0; j--)
    if (i == n - 1 && j == n - 1)
      //initialize particular value
    else
      //initialize others

но мне это кажется немного неэффективным.

Другим способом может быть инициализация значения matrix[n-1][n-1] вне цикла, затем выполнение 3 for циклов (один для нижней строки, один для самого правого столбца, один для других элементов). Но это выглядит немного не элегантно.

Таким образом, я ищу, если существует, решение, которое включает только два аннулирования for, и без элемента управления в каждом цикле (как в первом примере).

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я думаю, что решение Joakim хорошее, за исключением% и / операций ... Вдохновленный этим, я нашел интересный вариант, который их избегает. Я назвал индекс столбца j1, чтобы избежать проблем с другими "нормальными" циклами.

matrix[n-1][n-1] = //init code;
int j1 = n-2;

    for (int i = n-1; i >= 0; i--) {
        for (; j1 >= 0; j1--) {
            matrix[i][j1] = //init code;
        }
        j1 = n-1;
    }
0 голосов
/ 29 июня 2018

Вот подход, который использует один цикл по матрице, что позволяет легко избежать матрицы [n-1] [n-1]. Не уверен, как вычисления сравниваются с if, хотя с точки зрения производительности

int[][] matrix = new int[n][n];

int current = n * n - 2;
int row = 0;
int col = 0;
while (current >= 0) {
    col = current % n;
    row = current / n;

    matrix[row][col] = //init stuff
    current--;
}
...