不断递归来统计岛屿
岛屿数量
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;
}