【题目】 一个矩阵中只有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))
- 并行计算
使用并查集
收集边界信息
合并的时候,先查询,后合并。