给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。
* 一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
例:1
* 输入:
4 5
* 11110
* 11010
* 11000
* 00000
* 输出: 1
例2:
输入:
4 5
* 11000
* 11000
* 00100
* 00011
输出: 3
思路:
给数组中每一个0,1元素设置标志位temp;遍历二维数组,查看每一个元素的上下左右四个位置,若当前位置值为1,且其上、左位置都是0,则num加一;检查其右、下位置的元素,若等于1则将其表示位置为1;
public class NumOfIsland0721 {
class Node {
int val;
int temp;
}
public static void main(String[] args){
int line,row;
Scanner in = new Scanner(System.in);
line = in.nextInt();
row = in.nextInt();
Node[][] map = new Node[line][row];
for (int i = 0;i<line;i++){
for (int j = 0;j<row;j++){
Node node= new NumOfIsland0721().new Node();
node.val= in.nextInt();
node.temp=0;
map[i][j]=node;
}
}
int num=0;
for (int i = 0;i<line;i++){
for (int j = 0;j<row;j++){
if (map[i][j].val==1&&map[i][j].temp==0){
int u=0,d=0,l=0,r=0;
//上
if (i-1>=0){
u=map[i-1][j].val;
}
//下
if (i+1<line){
d=map[i+1][j].val;
if (d==1){
map[i+1][j].temp=1;
}
}
//左
if (j-1>=0){
l=map[i][j-1].val;
}
//右
if (j+1<row){
r=map[i][j+1].val;
if (r==1){
map[i][j+1].temp=1;
}
}
if (u==0&&l==0){
num++;
}
}
}
}
System.out.println(num);
}
}
广度优先遍历算法思想:
广度优先: