2 //解题思路:遍历每个格子dfs访问当前格子的相领黑格
3 #include <stdio.h>
4 #include <string.h>
5
6 #define MAXN 1000
7
8 int mat[MAXN][MAXN], vis[MAXN][MAXN];
9
10 void DFS(int x, int y){
11 int i;
12 if(mat[x][y] == 0|| vis[x][y] == 1) return ; //曾经访问过这个格子,或者当前格子为空
13 vis[x][y] = 1; //标记(x, y)已访问过
14 //递归访问周围的8个格子
15 DFS(x, y + 1);
16 DFS(x, y - 1);
17 DFS(x + 1, y - 1);
18 DFS(x + 1, y + 1);
19 DFS(x - 1, y + 1);
20 DFS(x - 1, y - 1);
21 DFS(x + 1, y);
22 DFS(x - 1, y);
23 }
24
25 int main(){
26 int n, i, j, ans;;
27 char s[MAXN];
28 while(scanf("%d", &n) != EOF){
29 memset(mat, 0, sizeof(mat)); //所有格子都初始化为白色,包括周围一圈的虚拟格子
30 memset(vis, 0, sizeof(vis)); //所有各自都没有访问过
31 for(i = 0; i < n; i++){
32 scanf("%s", s);
33 for(j = 0; j < n; j++){
34 mat[i + 1][j + 1] = s[j] - ‘0‘;//把图像往中间移动一格,空出一圈白格子
35 }
36 }
37 ans = 0;
38 for(i = 1; i <= n; i++){
39 for(j = 1; j <= n; j++){
40 if(vis[i][j] == 0 && mat[i][j] == 1){
41 DFS(i, j); //找到所有未访问过的黑格
42 ans++;
43 }
44 }
45 }
46 printf("%d\n", ans);
47 }
48 return 0;
49 }