给定'1'
s(土地)和'0'
s(水)的2d网格图,计算岛屿的数量。岛被水包围,通过水平或垂直连接相邻的土地而形成。您可以假设网格的所有四个边都被水包围。
废话不多说, 直接上代码
/**
* 给定'1's(土地)和'0's(水)的2d网格图,计算岛屿的数量。岛被水包围,通过水平或垂直连接相邻的土地而形成。您可以假设网格的所有四个边都被水包围。
* 如果两个1相邻代表是一个岛屿
* 输入:
11110
11010
11000
00000
输出:1
{{11110},{11010},{11000},{00000}}
输入:
11000
11000
00100
00011
{{11000},{11000},{00100},{00011}}
输出: 3
*/
public class NumBerOfIsLands {
public static void main(String[] args) {
char[][] grid ={{'1','1','1','1','0','0'},{'1','1','1','1','0','1'},{'1','1','1','1','0','0'},{'1','1','1','1','0','0'}}; //
System.out.println(numIsLands(grid));
}
private static int numIsLands(char[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
System.out.println("输入的数据有误!!!!");
return 0;
}
//获取grid的长度作为行,grid[0]的长度作为列
int rows = grid.length;
int cols = grid[0].length;
int c = 0;
for (int i = 0; i < rows; i++) {
for (int k = 0; k < cols; k++) {
//如果当前的坐标为1时,开始向四个方向进行搜索,
if (grid[i][k] == '1') {
c++;
doSearch(grid, i, k, rows, cols);
}
}
}
return c;
}
/**
* @Description:进行四个方向搜索
*/
private static void doSearch(char[][] grid, int i, int k, int rows, int cols) {
if (i < 0 || i >= rows || k < 0 || k >= cols) {
return;
}
if (grid[i][k] != '1') {
return;
}
grid[i][k] = '0';
//进行上下左右搜索
doSearch(grid, i + 1, k, rows, cols);
doSearch(grid, i - 1, k, rows, cols);
doSearch(grid, i, k + 1, rows, cols);
doSearch(grid, i, k -1, rows, cols);
}
}