每日算法(四十三)-java为了更改的规划城市,需要统计楼栋数目信息。
为了更改的规划城市,需要统计楼栋数目信息。
方法如下,一张航拍照片会被分隔为N*M个小格子,每个格子可以用0跟1来表示。如果楼栋的楼顶出现在了格子里,
那么此格子就被设置为1,出现在相邻格子里的楼顶被记为同一座楼栋,若是斜邻的则记为不同的楼栋。求一张图里的楼栋总数目。
例如,
输入{{0,0,0,0,0},{0,1,1,0,0},{0,0,1,1,0},{0,0,0,0,0},{0,0,0,0,0} };输出的结果应为1
输入{ {0,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,0} }输出的结果应为2、、
这里因为是一个N*M的格子,所以直接就是遍历所有格子,如果是1就先count++,然后根据条件相邻的都代表同一栋,否则继续遍历,这里重点在于判断条件相邻栋的时候我们可以用递归来表达,刚容易理解
代码如下:
public class Build {
public void sumBuild(int arr[][]){
int count=0;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++){
if(arr[i][j]==1){
count++;
dfs(arr,i,j);
}
}
}
System.out.println(count);
}
private void dfs(int[][] arr, int i, int j) {
if(i<0||i>arr.length||j<0||j>arr[0].length){
return;
}
if(arr[i][j]==1){
dfs(arr,i-1,j);
dfs(arr,i+1,j);
dfs(arr,i,j-1);
dfs(arr,i,j+1);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Build build=new Build();
int N = sc.nextInt();
int M= sc.nextInt();
int[][] arr = new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
arr[i][j] = sc.nextInt();
}
}
build.sumBuild(arr);
}
}