题目描述:
输入n,m,代表n行m列;
0代表有水,1代表陆地;
统计水池个数;
即求最大连通分量问题;
输入:3 3
101
110
100
输出:2
import java.util.Scanner;
public class 统计水池个数 {
static int map[][]=new int[100][100]; //存储数组
static int p[][]={{1,0},{-1,0},{0,-1},{0,1}}; //上下左右四个方向
static int n,m;
static void dfs(int x,int y){ //从当前坐标开始
for(int i=0;i<4;i++){ //搜索四个方向
int xx=x+p[i][0];
int yy=y+p[i][1];
if(xx<0 || xx>=n || yy<0 || yy>=m || map[xx][yy]==1) //越界或者是陆地,继续
continue;
map[xx][yy]=1; //否则,标记为陆地
dfs(xx,yy);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
m=scan.nextInt();
String str=null;
for(int i=0;i<n;i++){ //输入矩阵
str=scan.next(); //next()函数遇到换行或者空格就停止!!!
for(int j=0;j<m;j++)
map[i][j]=str.charAt(j)-'0'; //map是int型数组,注意类型转换
}
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(map[i][j]==0){
map[i][j]=1;
ans++;
dfs(i,j);
}
}
}
System.out.println(ans);
}
}