• 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 }
  • 相关阅读:
    try? try! try do catch try 使用详解
    Swift Write to file 到电脑桌面
    NSLayoutConstraint 使用详解 VFL使用介绍
    automaticallyAdjustsScrollViewInsets 详解
    Swift 给UITableView 写extension 时 报错 does not conform to protocol 'UITableViewDataSource'
    OC Swift中检查代码行数
    Swift中 @objc 使用介绍
    SWift中 '?' must be followed by a call, member lookup, or subscript 错误解决方案
    Swift 中 insetBy(dx: CGFloat, dy: CGFloat) -> CGRect 用法详解
    求1000之内所有“完数”(注:C程序设计(第四版) 谭浩强/著 P141-9)
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/4916420.html
Copyright © 2020-2023  润新知