• Calculate Number Of Islands And Lakes 解答


    Question

    1 1 1 1 1 0
    1 0 1 0 0 1
    1 0 1 0 0 1
    1 1 0 1 1 1

    1 is earth, 0 is water.

    i) count the number of 'islands' that the matrix has.
    ii) count the number of 'lakes' that the matrix has i.e. connected clump of zeros that is entirely surrounded by a single island

    Solution

    这是Number of Islands的升级版。关键在于lake的定义,必须被同一个岛包围。

    所以我们在dfs遍历岛的时候,给相同的岛同样的标号。然后在遍历水的时候,检查包围的岛是否是相同标号。

     1 import java.util.*;
     2 import java.io.*;
     3 
     4 public class Islands {
     5     private static final int[][] directions = {{0,1},{0,-1},{1,0},{-1,0}};
     6 
     7     public static void main(String[] args) {
     8         int[][] island = {
     9             {1, 1, 1, 1, 1, 0},
    10             {1, 0, 1, 0, 0, 1},
    11             {1, 0, 1, 0, 0, 1},
    12             {1, 1, 0, 1, 1, 1}
    13         };
    14         int m = island.length, n = island[0].length;
    15         // Calculate island number
    16         int color = 2;
    17         for (int i = 0; i < m; i++) {
    18             for (int j = 0; j < n; j++) {
    19                 if (island[i][j] == 1) {
    20                     dfs(island, color, i, j);
    21                     color++;
    22                 }
    23             }
    24         }
    25         int islandNum = color - 2;
    26         int lakeNum = 0;
    27         int surround = -2;
    28         for (int i = 0; i < m; i++) {
    29             for (int j = 0; j < n; j++) {
    30                 if (island[i][j] == 0) {
    31                     if (dfs2(island, surround, i, j)) {
    32                         lakeNum++;
    33                     }
    34                 }
    35             }
    36         }
    37         System.out.println(islandNum);
    38         System.out.println(lakeNum);
    39 
    40     }
    41 
    42     private static void dfs(int[][] island, int color, int x, int y) {
    43         int m = island.length, n = island[0].length;
    44         island[x][y] = color;
    45         int newX, newY;
    46         for (int i = 0; i < 4; i++) {
    47             newX = x + directions[i][0];
    48             newY = y + directions[i][1];
    49             if (newX < 0 || newX >= m || newY < 0 || newY >= n)
    50                 continue;
    51             if (island[newX][newY] != 1)
    52                 continue;
    53             dfs(island, color, newX, newY);
    54         }
    55     }
    56 
    57     private static boolean dfs2(int[][] island, int surround, int x, int y) {
    58         int m = island.length, n = island[0].length;
    59         island[x][y] = -1;
    60         int newX, newY;
    61         for (int i = 0; i < 4; i++) {
    62             newX = x + directions[i][0];
    63             newY = y + directions[i][1];
    64             if (newX < 0 || newX >= m || newY < 0 || newY >= n)
    65                 continue;
    66             int color = island[newX][newY];
    67             if (color == -1)
    68                 continue;
    69             if (color != 0) {
    70                 // This point is earth
    71                 if (surround == -2) {
    72                     surround = color;
    73                 } else if (surround != color) {
    74                     return false;
    75                 }
    76             } else {
    77                 if (!dfs2(island, surround, newX, newY))
    78                     return false;
    79             }
    80 
    81         }
    82         return true;
    83     }
    84 }
  • 相关阅读:
    【[Offer收割]编程练习赛12 B】一面砖墙
    【[Offer收割]编程练习赛12 A】歌德巴赫猜想
    【codeforces 779E】Bitwise Formula
    Java Web整合开发(85)
    数字
    T2602 最短路径问题 codevs
    P3378 堆【模板】 洛谷
    T1013 求先序排列 codevs
    P1717 钓鱼 洛谷
    P2085 最小函数值 洛谷
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4916420.html
Copyright © 2020-2023  润新知