алгоритм для наибольшего острова в заданной матрице

Для меня решение было: Build Phases - Link Binary With Libraries добавляет libc ++ и работает в моем устаревшем проекте.

0
задан brain storm 13 July 2018 в 23:08
поделиться

1 ответ

В вашем коде есть две ошибки.

См. комментарий от Mick для первой ошибки:

Одна очевидная проблема в dfsIsland() по крайней мере, это for (int col = 0; col < cols; cols++), вероятно, будет for (int col = 0; col < cols; col++) вместо этого (возможно, даже лучше использовать общие i и j для индексов строки / столбца.)

Вторая ошибка ваше использование count в методе mark, наиболее убедительно отсутствие использования возвращаемого значения в рекурсивном вызове. Помните, что Java передается по значению. Подсказка: Я предлагаю вам удалить count в качестве параметра.

После исправления ошибок вывод будет:

[7, 2, 2]


public class IslandConnectedCell {

    public static void main(String... args) {
        int[][] board = { {1,0,0,0,1},
                          {1,1,1,1,1},
                          {0,0,0,0,0},
                          {1,1,0,1,1} };
        System.out.println(new IslandConnectedCell(board).getIslandSizes());
    }

    private final int[][] board;
    private final int rows;
    private final int cols;

    public IslandConnectedCell(int[][] board) {
        this.board = board;
        this.rows = board.length;
        this.cols = board[0].length;
    }

    public List<Integer> getIslandSizes() {
        boolean visited[][] = new boolean[this.rows][this.cols];
        List<Integer> countList = new ArrayList<>();
        for (int row = 0; row < this.rows; row++)
            for (int col = 0; col < this.cols; col++)
                if (this.board[row][col] == 1 && ! visited[row][col])
                    countList.add(mark(row, col, visited));
        return countList;
    }

    private int mark(int row, int col, boolean[][] visited) {
        if (row >= this.rows || row < 0 || col >= this.cols || col < 0 || this.board[row][col] == 0 || visited[row][col])
            return 0;
        visited[row][col] = true;
        int count = 1;
        for (int r = -1; r <= 1; r++)
            for (int c = -1; c <= 1; c++)
                if (r != 0 || c != 0)
                    count += mark(row + r, col + c, visited);
        return count;
    }

}

UPDATE

Чтобы получить желаемый результат [7, 4] ( исходный вопрос ), плате необходимо будет использовать горизонтальное обертывание , поэтому два небольших острова на нижней линии становятся одним большим островом.

Это легко осуществить, изменив одну строку кода, чтобы обернуть индекс столбца с помощью модуля модуля %:

count += mark(row + r, (col + c + this.cols) % this.cols, visited);
5
ответ дан Andreas 17 August 2018 в 12:07
поделиться
  • 1
    Аккуратное решение. Спасибо, что поймал ошибку на проходе по стоимости. – brain storm 13 July 2018 в 23:10
Другие вопросы по тегам:

Похожие вопросы: