不断递归来统计岛屿
岛屿数量
http://www.nowcoder.com/questionTerminal/0c9664d1554e466aa107d899418e814e
1,遍历过程中一旦发现一个1,就代表找到一块岛屿的第一个位置,将其设置为2保证不再重复,同时count++;
for (int y = 0, y_size = arr.length; y < y_size; y++) { for (int x = 0, x_size = arr[y].length; x < x_size; x++) { if (arr[y][x] == 1) { count ++; // 记一个岛 arr[y][x] = 2;// 确保不重复 } } }
2,找到该岛屿后,开始有当前坐标向周围展开;
private void recursion(int[][] arr, int x, int y) { if (不能再向四周延伸) return; if (能向左延伸) recursion(arr, x-1, y); if (能向右延伸) recursion(arr, x+1, y); if (能向上延伸) recursion(arr, x, y-1); if (能向下延伸) recursion(arr, x, y+1); }
3,关于岛屿的判断逻辑;
private boolean canGoLeft(int[][] arr, int x, int y){ // 已达到边界或者左边是海(既arr[y][x] == 0) if (x == 0 || arr[y][x-1] != 1) return false; return true; }
4,代码
public static void main() { int count = 0; for (int y = 0, y_size = arr.length; y < y_size; y++) { for (int x = 0, x_size = arr[y].length; x < x_size; x++) { if (arr[y][x] == 1) { count ++; // 记为一个岛 recursion(arr, x, y); } } } System.out.println(String.format("共%d座岛屿", count)); } public static void recursion(int[][] arr, int x, int y) { arr[y][x] = 2; if (!canGoLeft(arr, x, y) && !canGoRight(arr, x, y) && !canGoUp(arr, x, y) && !canGoDown(arr, x, y)) return; if (canGoLeft(arr, x, y)) recursion(arr, x-1, y); if (canGoRight(arr, x, y)) recursion(arr, x+1, y); if (canGoUp(arr, x, y)) recursion(arr, x, y-1); if (canGoDown(arr, x, y)) recursion(arr, x, y+1); } private static boolean canGoRight(int[][] arr, int x, int y){ if (x == arr[y].length-1 || arr[y][x+1] != 1) return false; return true; }