问题描述
GeoSurvComp地质勘测公司负责探测地下石油矿床。GeoSurvComp 一次处理一个大型矩形土地区域,并创建一个网格,将土地划分为多个正方形地块。然后,它分别分析每个地块,使用传感设备来确定该地块是否含有石油。含有石油的地块称为口袋。如果两个口袋相邻,则它们是同一油沉积物的一部分。油沉积物可能非常大,并且可能包含许多口袋。你的工作是确定一个网格中包含多少个不同的油沉积物。
输入
输入文件包含一个或多个网格。每个网格都以包含 m 和 n 的行开头,m 和 n 是网格中的行数和列数,由一个空格分隔。如果 m = 0,则表示输入结束;否则,1 <= m <= 100 和 1 <= n <= 100。紧随其后的是 m 行,每行 n 个字符(不包括行尾字符)。每个字符对应一个情节,要么是“*”,代表没有油,要么是“@”,代表油袋。
输出
对于每个网格,输出不同油沉积物的数量。如果两个不同的口袋在水平、垂直或对角线上相邻,则它们是同一油床的一部分。一个油储物不会包含超过 100 个口袋。
示例输入
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
示例输出
0
1
2
2
0
1
2
2
import java.util.Scanner;
public class Main {
static char[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int m = sc.nextInt();// 行数
if (m == 0)
return;
int n = sc.nextInt();// 列数
arr = new char[m][n];
int num = 0;
for (int i = 0; i < arr.length; i++) {
String s = sc.next();
for (int j = 0; j < arr[0].length; j++) {
arr[i][j] = s.charAt(j);
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j] == '@') {
dfs(i, j);
num++;
}
}
}
System.out.println(num);
}
}
public static void dfs(int i, int j) {
if (i < 0 || j < 0 || i >= arr.length || j >= arr[0].length)
return;
if (arr[i][j] == '*')
return;// 走过了
arr[i][j] = '*';
dfs(i, j - 1);
dfs(i, j + 1);
dfs(i + 1, j);
dfs(i - 1, j);
dfs(i + 1, j + 1);
dfs(i - 1, j + 1);
dfs(i - 1, j - 1);
dfs(i + 1, j - 1);
}
}