题目:
给定一个二维数组,所有未知的值不是0就是1。规定每个位置可以和它上下左右位置上的值相连。有一个叫做岛的概念,定义如下:
连成一片的一1,如果周围都是0,那么这一片1,构成一个岛,求整张图岛的个数
例如:
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, 0
这有三个岛。
思路:“感染”,从头开始遍历数组,遇到1,使其变为2,使岛的个数++,开始感染(与这个1上下左右相邻的1,都变为2),继续向后遍历,遇到1就做同样的操作,知道数组遍历完。
import java.util.Scanner;
public class Main {
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, 0 }, };
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));
}
//计算岛的个数
public static int countIslands(int[][] m){
if (m == null || m[0] == null) {
return 0;
}
int N=m.length;
int M=m[0].length;
int res=0;
for (int i=0;i<N;i++){
for (int j=0;j<M;j++){
if (m[i][j] == 1) {
res++;
infect(m,i,j,N,M);
}
}
}
return res;
}
//感染
public static void infect(int[][] m,int i,int j,int N,int M){
if (i < 0 || i >= N || j < 0 || j >= M || m[i][j] != 1) {
return;
}
m[i][j]=2;
infect(m,i+1,j,N,M);
infect(m,i-1,j,N,M);
infect(m,i,j+1,N,M);
infect(m,i,j-1,N,M);
}
}