Для меня решение было: Build Phases - Link Binary With Libraries добавляет libc ++ и работает в моем устаревшем проекте.
В вашем коде есть две ошибки.
См. комментарий от 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);