不断递归来统计岛屿

岛屿数量

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;
}
全部评论

相关推荐

微风不断:兄弟,你把四旋翼都做出来了那个挺难的吧
点赞 评论 收藏
分享
10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务