题目:
给的一个二维数组,只含有0和1两个字符。其中1代表陆地,0代表水域。横向和纵向的陆地连接成岛屿,被水域分隔开。问给出的地图中有多少岛屿?
示例一:
输入:
11110
11010
11000
00000
输出:
1
示例二:
输入:
11000
11000
00100
00011
输出:
2
思路:
flood fill方法
代码如下:
package com.haobi; public class NumberofIslands { private static int m, n; // 搜索顺序 private static int d[][] = {{-1,0},{0,1},{1,0},{0,-1}}; private static boolean visited[][]; private static boolean inArea(int x, int y) { return x>=0 && x<m && y>=0 && y<n; } public static void main(String[] args) { //示例1 char[][] c1 = {{'1','1','1','1','0'}, {'1','1','0','1','0'}, {'1','1','0','0','0'}, {'0','0','0','0','0'}}; //示例2 char[][] c2 = {{'1','1','0','0','0'}, {'1','1','0','0','0'}, {'0','0','1','0','0'}, {'0','0','0','1','1'}}; System.out.println(numIslands(c2)); } public static int numIslands(char[][] grid) { m = grid.length; n= grid[0].length; //初始化 visited = new boolean[m][n]; int res = 0; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(grid[i][j] == '1' && !visited[i][j]) { res++; dfs(grid, i, j); } } } return res; } /** * 递归算法 * 从grid[x][y]的位置开始,进行floodfill * 保证(x,y)是合法的,且grid[x][y]是没有被访问过的陆地 * @param grid * @param x * @param y */ private static void dfs(char[][]grid, int x, int y) { visited[x][y] = true; //搜索四个方向 for(int i=0;i<4;i++) { int newx = x + d[i][0]; int newy = y + d[i][1]; if(inArea(newx, newy) && !visited[newx][newy] && grid[newx][newy] == '1') { dfs(grid, newx, newy); } } return; } }程序输出结果如下:
3