首页 > 试题广场 >

岛屿计算

[编程题]岛屿计算
  • 热度指数:429 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。

 e.g. 输入:

grid = [

          ["1","1","1","1","0"],
          ["1","1","0","1","0"],

          ["1","1","0","0","0"], 

          ["0","0","0","0","0"] 

        ] 

输出:1

示例1

输入

[["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]

输出

1
很简单,深度优先搜索模板题,遍历网格,如果当前坐标为“陆地”就进行深搜,将当前“陆地”所在的大陆全部“感染”成“水”,岛屿计数+1。
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid string字符串二维数组 插槽数组
     * @return int整型
     */
    public int numIslands (String[][] grid) {
        // write code here
        int islandNums = 0;
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[i].length; j++){
                if("1".equals(grid[i][j])){
                    dfs(i, j, grid);
                    islandNums ++;
                }
            }
        }
        return islandNums;
    }
    
    private void dfs(int i, int j, String[][] grid) {
        if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || "0".equals(grid[i][j])) return;
        grid[i][j] = "0";
        dfs(i + 1, j, grid);
        dfs(i - 1, j, grid);
        dfs(i, j + 1, grid);
        dfs(i, j - 1, grid);
    }
}

编辑于 2021-09-22 10:01:18 回复(2)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid string字符串vector<vector<>> 插槽数组
     * @return int整型
     */
    void dfs(int x, int y, int n, int m, vector<vector<string>>& grid) {
        if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == "0") return;
        grid[x][y] = "0";
        dfs(x + 1, y, n, m, grid);
        dfs(x - 1, y, n, m, grid);
        dfs(x, y + 1, n, m, grid);
        dfs(x, y - 1, n, m, grid);
        return;
    }
    int numIslands(vector<vector<string> >& grid) {
        // write code here
        int res = 0;
        if (grid.empty()) return 1;
        int n = grid.size();
        int m = grid[0].size();
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (grid[i][j] == "1") {
                    res += 1;
                    dfs(i, j, n, m, grid);
                }
            }
        }
        return res;
    }
};
思路应该都差不多c++版本
发表于 2021-12-14 10:57:41 回复(0)
import java.util.*;

public class Solution {
    // 岛屿的数量
    int m = 0, n = 0;
    int[][] d = new int[][]{{1,0}, {0,1}, {0,-1}, {-1,0}};
    public int numIslands (String[][] grid) {
        m = grid.length;
        n = grid[0].length;
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j].equals("1")) {
                    res++;
                    dfs(grid, i, j);
                }
            }
        }
        return res;
    }
    // dfs模板处理
    public void dfs(String[][] grid, int i, int j) {
        grid[i][j] = "0";
        for (int k = 0; k < 4; k++) {
            int ni = i + d[k][0], nj = j + d[k][1];
            if (ni >= 0 && ni < m && nj >= 0 && nj < n && grid[ni][nj].equals("1")) {
                dfs(grid, ni, nj);
            }
        }
    }
}
发表于 2022-07-03 12:40:23 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid string字符串二维数组 插槽数组
     * @return int整型
     */
    boolean[][] isUseGrid;

    public int numIslands(String[][] grid) {
        // write code here
        isUseGrid = new boolean[grid.length][grid[0].length];
        int count = 0;
        for(int i=0; i<grid.length; i++){
            for(int j=0; j<grid[i].length; j++){
                if(isUseGrid[i][j] || grid[i][j].equals("0")){
                    continue;
                }else {
                    handle(grid, i, j);
                    count ++;
                }
            }
        }
        return count;
    }
    public void handle(String[][] grid, int i, int j){
        if(grid[i][j].equals("0")){
            return;
        }
        isUseGrid[i][j] = true;
        if(i+1 < grid.length){
            handle(grid, i+1, j);
        }
        if(j+1 < grid[i].length){
            handle(grid, i, j+1);
        }
    }
}

发表于 2021-09-06 08:51:30 回复(0)