/**
* 給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。
* 一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連接而成的。
* 你可以假設網格的四個邊均被水包圍。
* <p>
* 示例 1:
* <p>
* 輸入:
* 11110
* 11010
* 11000
* 00000
* <p>
* 輸出: 1
* 示例 2:
* <p>
* 輸入:
* 11000
* 11000
* 00100
* 00011
* <p>
* 輸出: 3
* <p>
* 來源:力扣(LeetCode)
* 鏈接:https://leetcode-cn.com/problems/number-of-islands
* 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
*/
public class Solution {
private static char LAND = '1';// 陸地
private static char WATER = '0';// 水
private static int[] DX = {-1, 1, 0, 0};
private static int[] DY = {0, 0, -1, 1};
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int count = 0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
char currentChar = grid[i][j];
if (currentChar == LAND) {
count++;
dfs(i, j, grid);
}
}
}
return count;
}
private void dfs(int i, int j, char[][] grid) {
// 遞歸終止條件
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == WATER) {
return;
}
grid[i][j] = WATER;
for (int k = 0; k < DX.length; k++) {
dfs(i + DX[k], j + DY[k], grid);
}
}
}
變形題
/**
* 給定一個包含了一些 0 和 1 的非空二維數組 grid 。
* 一個 島嶼 是由一些相鄰的 1 (代表土地) 構成的組合,這裏的「相鄰」要求兩個 1 必須在水平或者豎直方向上相鄰。
* 你可以假設 grid 的四個邊緣都被 0(代表水)包圍着。
* 找到給定的二維數組中最大的島嶼面積。(如果沒有島嶼,則返回面積爲 0 。)
*
* 示例 1:
*
* [[0,0,1,0,0,0,0,1,0,0,0,0,0],
* [0,0,0,0,0,0,0,1,1,1,0,0,0],
* [0,1,1,0,1,0,0,0,0,0,0,0,0],
* [0,1,0,0,1,1,0,0,1,0,1,0,0],
* [0,1,0,0,1,1,0,0,1,1,1,0,0],
* [0,0,0,0,0,0,0,0,0,0,1,0,0],
* [0,0,0,0,0,0,0,1,1,1,0,0,0],
* [0,0,0,0,0,0,0,1,1,0,0,0,0]]
* 對於上面這個給定矩陣應返回 6。注意答案不應該是 11 ,因爲島嶼只能包含水平或垂直的四個方向的 1 。
*
* 示例 2:
*
* [[0,0,0,0,0,0,0,0]]
* 對於上面這個給定的矩陣, 返回 0。
* 注意: 給定的矩陣grid 的長度和寬度都不超過 50。
*
* 來源:力扣(LeetCode)
* 鏈接:https://leetcode-cn.com/problems/max-area-of-island
* 著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
*/
class Solution {
private static int LAND = 1;// 陸地
private static int WATER = 0;// 水
private static int[] DX = {-1, 1, 0, 0};
private static int[] DY = {0, 0, -1, 1};
public int numIslands(int [][] grid) {
if (grid == null || grid.length == 0) {
return 0;
}
int ans =0;
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
int currentChar = grid[i][j];
if (currentChar == LAND) {
ans = Math.max(ans,dfs(i, j, grid));
}
}
}
return ans;
}
private int dfs(int i, int j, int [][] grid) {
// 遞歸終止條件
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == WATER) {
return 0;
}
int ans = 1;
grid[i][j] = WATER;
for (int k = 0; k < DX.length; k++) {
ans+=dfs(i + DX[k], j + DY[k], grid);
}
return ans;
}
}
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static int[][] stringToInt2dArray(String input) {
JsonArray jsonArray = JsonArray.readFrom(input);
if (jsonArray.size() == 0) {
return new int[0][0];
}
int[][] arr = new int[jsonArray.size()][];
for (int i = 0; i < arr.length; i++) {
JsonArray cols = jsonArray.get(i).asArray();
arr[i] = stringToIntegerArray(cols.toString());
}
return arr;
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[][] grid = stringToInt2dArray(line);
int ret = new Solution().maxAreaOfIsland(grid);
String out = String.valueOf(ret);
System.out.print(out);
}
}
}