diff --git a/src/main/java/com/dota/gridGraph/_1254/Solution.java b/src/main/java/com/dota/gridGraph/_1254/Solution.java new file mode 100644 index 0000000..bdb6db0 --- /dev/null +++ b/src/main/java/com/dota/gridGraph/_1254/Solution.java @@ -0,0 +1,49 @@ +package com.dota.gridGraph._1254; + +class Solution { + int n; + int m; + + public static void main(String[] args) { + new Solution().closedIsland(new int[][]{ + {0,0,1,1,0,1,0,0,1,0}, + {1,1,0,1,1,0,1,1,1,0}, + {1,0,1,1,1,0,0,1,1,0}, + {0,1,1,0,0,0,0,1,0,1}, + {0,0,0,0,0,0,1,1,1,0}, + {0,1,0,1,0,1,0,1,1,1}, + {1,0,1,0,1,1,0,0,0,1}, + {1,1,1,1,1,1,0,0,0,0}, + {1,1,1,0,0,1,0,1,0,1}, + {1,1,1,0,1,1,0,1,1,0} + }); + } + + public int closedIsland(int[][] grid) { + n = grid.length; + m = grid[0].length; + int res = 0; + var book = new boolean[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grid[i][j] == 0 && !book[i][j]) { + if (dfs(i, j, grid, book)) { + res++; + } + } + } + } + return res; + } + + boolean dfs(int i, int j, int[][] grid, boolean[][] book) { + if (i < 0 || j < 0 || i > n - 1 || j > m - 1) return false; + if (grid[i][j] == 1 || book[i][j]) { + book[i][j] = true; + return true; + } + + book[i][j] = true; + return dfs(i + 1, j, grid, book) & dfs(i - 1, j, grid, book) & dfs(i, j + 1, grid, book) & dfs(i, j - 1, grid, book); + } +} \ No newline at end of file diff --git a/src/main/java/com/dota/gridGraph/_16_19/Solution.java b/src/main/java/com/dota/gridGraph/_16_19/Solution.java new file mode 100644 index 0000000..064b4d1 --- /dev/null +++ b/src/main/java/com/dota/gridGraph/_16_19/Solution.java @@ -0,0 +1,43 @@ +package com.dota.gridGraph._16_19; + +import java.util.ArrayList; +import java.util.Arrays; + +class Solution { + public int[] pondSizes(int[][] land) { + int n = land.length, m = land[0].length; + var set = new ArrayList(); + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + int t = dfs(i, j, land); + if (t > 0) { + set.add(t); + } + } + } + var res = new int[set.size()]; + for (int i = 0; i < set.size(); i++) { + res[i] = set.get(i); + } + Arrays.sort(res); + return res; + } + + int[] next = new int[]{1, 0, -1}; + + int dfs(int i, int j, int[][] land) { + int n = land.length, m = land[0].length; + if (i < 0 || i >= n || j < 0 || j >= m || land[i][j] > 0) { + return 0; + } + + land[i][j] = 1; + int t = 1; + for (int i1 : next) { + for (int i2 : next) { + t += dfs(i + i1, j + i2, land); + } + } + return t; + } +} \ No newline at end of file diff --git a/src/main/java/com/dota/gridGraph/_2658/Solution.java b/src/main/java/com/dota/gridGraph/_2658/Solution.java new file mode 100644 index 0000000..dda1bfe --- /dev/null +++ b/src/main/java/com/dota/gridGraph/_2658/Solution.java @@ -0,0 +1,25 @@ +package com.dota.gridGraph._2658; + +class Solution { + int n = 0; + int m = 0; + + public int findMaxFish(int[][] grid) { + int max = 0; + n = grid.length; + m = grid[0].length; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + max = Math.max(max, dfs(i, j, grid)); + } + } + return max; + } + + int dfs(int i, int j, int[][] grid) { + if (i < 0 || i >= n || j < 0 || j >= m || grid[i][j] == 0) return 0; + int t = grid[i][j]; + grid[i][j] = 0; + return t + dfs(i - 1, j, grid) + dfs(i + 1, j, grid) + dfs(i, j - 1, grid) + dfs(i, j + 1, grid); + } +} \ No newline at end of file diff --git a/src/main/java/com/dota/gridGraph/lcs03/Solution.java b/src/main/java/com/dota/gridGraph/lcs03/Solution.java new file mode 100644 index 0000000..b7e4cdd --- /dev/null +++ b/src/main/java/com/dota/gridGraph/lcs03/Solution.java @@ -0,0 +1,72 @@ +package com.dota.gridGraph.lcs03; + +class Solution { + int max = 0; + int n = 0; + int m = 0; + + public static void main(String[] args) { + new Solution().largestArea(new String[]{"110","231","221"}); + } + + public int largestArea(String[] grid) { + n = grid.length; + m = grid[0].length(); + var grids = new char[n][m]; + for (int i = 0; i < grid.length; i++) { + for (int j = 0; j < grid[i].length(); j++) { + grids[i][j] = grid[i].charAt(j); + } + } + var book = new boolean[n][m]; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (grids[i][j] == '0' || i==0||j==0||i==n-1||j==m-1) { + dfs(i, j, grids[i][j], grids); + } + } + } + + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + max = Math.max(max, df(i, j, grids[i][j], grids, book)); + } + } + + return max; + } + + int df(int i, int j, char v, char[][] grids, boolean[][] book) { + if (i < 0 || i >= n || j < 0 || j >= m || grids[i][j] == '6' || grids[i][j] != v || book[i][j]) return 0; + // 遍历过的 + book[i][j] = true; + return 1 + df(i - 1, j, v, grids, book) + df(i + 1, j, v, grids, book) + df(i, j - 1, v, grids, book) + df(i, j + 1, v, grids, book); + } + + // 靠近走廊的数字全干掉,变成6 + void dfs(int i, int j, char v, char[][] grids) { + if (i < 0 || i >= n || j < 0 || j >= m || grids[i][j] == '6' || grids[i][j] != v) return; + if (grids[i][j] == '0') { + grids[i][j] = '6'; + if (i + 1 < n) { + dfs(i + 1, j, grids[i + 1][j], grids); + } + if (i - 1 >= 0) { + dfs(i - 1, j, grids[i - 1][j], grids); + } + if (j + 1 < m) { + dfs(i, j + 1, grids[i][j + 1], grids); + } + if (j - 1 >= 0) { + dfs(i, j - 1, grids[i][j - 1], grids); + } + + return; + } + grids[i][j] = '6'; + dfs(i - 1, j, v, grids); + dfs(i + 1, j, v, grids); + dfs(i, j - 1, v, grids); + dfs(i, j + 1, v, grids); + } +} \ No newline at end of file