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   llcl  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
 
点击右上角即可分享
微信分享提示