题目就是求连通块的一个题,理解题目意思后就会显得比较简单
1:
我们要理解什么是连通块,连通块就是只有有2个@连在一起就是属于同一个连通块,就是要我们求输入的图中有多少个连通块。
2:
在我们需要多次输入数据时,我们可以这样:
import java.util.*;
public class Uva572 {
char a[][]; // 保存油田
boolean c[][]; // 是否访问
public static void main(String args[]) {
int m, n; // 行 列
Uva572 t = new Uva572();
Scanner sc = new Scanner(System.in);
m = sc.nextInt();
n = sc.nextInt();
while (m >= 0 && n >= 0) {
int count = 0;
t.a = new char[m][n];
t.c = new boolean[m][n];
for (int i = 0; i < m; i++) {
String b = sc.next();
t.a[i] = b.toCharArray(); // 输入完成
}
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
t.c[i][j] = false; // 初始为未被初始化
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!t.c[i][j] && t.a[i][j] == '@') {
count++;
t.DFS(i,j);
}
}
}
System.out.println(count);
m = sc.nextInt();
n = sc.nextInt();
}
}
public void DFS(int i, int j) {
try {
if (c[i][j] || a[i][j] != '@') // 已访问或不是@
return;
c[i][j] = true;
for (int x = -1; x <= 1; x++)
for (int y = -1; y <= 1; y++)
if (x != 0 || y != 0)
DFS(x+i, y+j);
}
catch (Exception e) { // 出界则返回
return;
}
}
}