clllll  

【题目】 一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 四个位置相连,如 果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?
【举例】 001010
111010
100100
000000
这个矩阵中有三个岛

  • 非并行算法求解
    1)从左到右,从上到下遍历。
    2)如果来到一个是1 的 位置,开始一个“感染”过程,就是从当前位置出发,把连成一片的1全部变成 2.
    “感染”过程结束后,继续遍历。直到结束。
    3)有多少次感染过程,就有多少个岛

java实现:

package demo05;

public class IsLand {
    public static int countIslands(int[][] m) {

        int result = 0; // 累积保存岛的数量。
        int hang = m.length;  //行数 
        int lie = m[0].length; //列数
        for (int i = 0; i < hang; i++) {
            for (int j = 0; j < lie; j++) {
                if (m[i][j] == 1) {
                    result += 1;
                    infect(m, i, j, hang, lie);
                    System.out.println(m);
                }
            }
        }

        return result;
    }

    public static void infect(int[][] m, int i, int j, int hang, int lie) {
        // 判断当前 是否越界, 如果不等于1 就返回
        if (i < 0 || i >= hang || j < 0 || j >= lie || m[i][j] != 1) {
            return;
        }
        m[i][j] = 2; // 感染
        infect(m, i - 1, j, hang, lie);
        infect(m, i + 1, j, hang, lie);
        infect(m, i, j + 1, hang, lie);
        infect(m, i, j - 1, hang, lie);
    }

    public static void main(String[] args) {
        int[][] m1 = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                { 0, 1, 1, 1, 0, 1, 1, 1, 0 },
                { 0, 1, 1, 1, 0, 0, 0, 1, 0 },
                { 0, 1, 1, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 1, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0, 0, 1 }, };
        System.out.println(countIslands(m1));

        int[][] m2 = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 },
                { 0, 1, 1, 1, 1, 1, 1, 1, 0 },
                { 0, 1, 1, 1, 0, 0, 0, 1, 0 },
                { 0, 1, 1, 0, 0, 0, 1, 1, 0 },
                { 0, 0, 0, 0, 0, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 1, 1, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, };
        System.out.println(countIslands(m2));

    }

}

python实现

# coding: utf-8

def count_island(m):
    if m is None or len(m) == 0:
        return 
    
    hang = len(m)
    lie = len(m[0])
    result = 0
    for i in range(hang):
        for j in range(lie):
            if(m[i][j] == 1):
                result += 1
                infect(m, i, j, hang,lie)
    return result 


def infect(m, i, j, hang,lie ):

    if i < 0 or i>=hang or j <0 or j>=lie or m[i][j] != 1:
        return 
    
    m[i][j] =2
    infect(m, i+1, j, hang,lie)
    infect(m, i-1, j, hang,lie)
    infect(m, i, j+1, hang,lie)
    infect(m, i, j-1, hang,lie)

m = [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 1, 1, 1, 0, 1, 1, 1, 0 ],
[ 0, 1, 1, 1, 0, 0, 0, 1, 0 ],
[ 0, 1, 1, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 1, 1, 0, 0 ],
[ 0, 0, 0, 0, 1, 1, 1, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0, 1 ], ]

print(count_island(m))
  • 并行计算
    使用并查集
    收集边界信息
    合并的时候,先查询,后合并。
posted on 2022-06-15 22:59  llcl  阅读(42)  评论(0编辑  收藏  举报