Просмотр матрицы / алгоритм Ли - PullRequest
0 голосов
/ 10 апреля 2020

Я должен сделать метод, который будет go через матрицу. Я даю координаты с клавиатуры позиции [L, C], откуда начнется расширение. Он перейдет к следующему значению, только если следующее значение меньше этого. На диагонали не go! PS: Извините за мой английский, как на картинке: введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Здесь необходимо выполнить три шага:

// prepare output matrix and fill it with -1
int[][] outMatrix = prepareOut(inputArray.length, inputArray[0].length);

// call recursively method to mark cells starting from the initial coordinates
outMatrix = markCell(inputArray, outMatrix, line, column, 1);

// print output matrix
printOutput(outMatrix);

Наиболее подходящая реализация метода может быть такой:

    static int[][] markCell(int[][] arr, int[][] out, int y, int x, int move) {
        int val = arr[y][x];
        if (out[y][x] == 0) {
            return out;
        } else if (out[y][x] < 0) {
            out[y][x] = move;
        }

        // checking a cell above the current one (north)
        if (y > 0 && out[y - 1][x] < 0) {
            if (cellMarked(arr, out, y - 1, x, val, move)) {
                out = markCell(arr, out, y -1, x, move + 1);
            }
        }
        // checking a cell under the current one (south)
        if (y < arr.length - 1 && out[y + 1][x] < 0) {
            if (cellMarked(arr, out, y + 1, x, val, move)) {
                out = markCell(arr, out, y +1, x, move + 1);
            }
        }
        // checking a cell to the left of the current one (west)
        if (x > 0 && out[y][x - 1] < 0) {
            if (cellMarked(arr, out, y, x - 1, val, move)) {
                out = markCell(arr, out, y, x - 1, move + 1);
            }
        }
        // checking a cell to the right of the current one (east)
        if (x < arr[0].length - 1 && out[y][x + 1] < 0) {
            if (cellMarked(arr, out, y, x +1, val, move)) {
                out = markCell(arr, out, y, x + 1, move + 1);
            }
        }
        return out;
    }

   static boolean cellMarked(int[][] arr, int[][] out, int y, int x, int val, int move) {
        final boolean marked = arr[y][x] <= val;
        out[y][x] = marked ? move : 0;
        return marked;
    }

При печати выходной матрицы вы заменяете оставшиеся -1 с 0:

    static void printOutput(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                char c = arr[i][j] <= 0 ? '0' : '*';
                System.out.print(c);
                System.out.print('\t');
            }
            System.out.print('\n');
        }
    }
0 голосов
/ 10 апреля 2020

prepareOut может быть реализовано так:

    private static int[][] prepareOut(int rows, int cols) {
        int [][] out = new int[rows][cols];
        for(int[] row: out) {
            Arrays.fill(row, -1);
        }
        return out;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...