public class UVa572 {
Scanner scanner = new Scanner(System.in);
char[][] pic = null;
int[][] idx = null;
int m = 0;
int n = 0;
void run(){
while(scanner.hasNextLine()){
//获取m n的值, c++中scanf("%d,%d", &m, &n)解决
String mn = scanner.nextLine();
String[] mnSplit = mn.split(" ");
m = Integer.parseInt(mnSplit[0]);
n = Integer.parseInt(mnSplit[1]);
//输入不合法时退出
if(m==0) break;
if(m<1||m>100||n<1||n>100) break;
pic = new char[m][n];
idx = new int[m][n]; //初始化idx, 所有初始值默认为0
//字符串变字符数组
for (int i = 0; i < m; i++) {
pic[i]=scanner.nextLine().toCharArray();
}
int cnt = 0;
for (int i = 0; i < m ; i++) {
for (int j = 0; j < n; j++) {
if(idx[i][j]==0 && pic[i][j] == '@')
dfs(i,j,++cnt);
}
}
System.out.println(cnt);
}
}
void dfs(int r, int c, int id) {
if (r < 0 || r >= m || c < 0 || c >= n) return; //出界的格子
if (idx[r][c] > 0 || pic[r][c] != '@') return; //不是"@"或者已经访问过的格子
idx[r][c] = id; //连通分量编号
for (int dr = -1; dr <= 1; dr++) //访问四周是否存在连通的格子
for (int dc = -1; dc <= 1; dc++)
if (dr != 0 || dc != 0) //自身格子不重复判断
dfs(r + dr, c + dc, id);
}
public static void main(String[] args){
new UVa572().run();
}
}
网友评论