【题目】 一个矩阵中只有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))
- 并行计算
使用并查集
收集边界信息
合并的时候,先查询,后合并。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统