输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者有公共顶点,就说它们属于同一个八连块。
如下图所示,八连块的个数为3。
即输入为:
6
1 0 0 1 0 0
0 0 1 0 1 0
0 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
0 1 0 1 0 0
输出
3
1 #include <stdio.h>
2 #include <string.h>
3
4 #define MAX 1000+10
5
6 char mat[MAX][MAX], vis[MAX][MAX];
7
8 void dfs(int x, int y) //mat[][]存图像,1代表黑; vis[][]标记是否访问过这个格子
9 {
10 if (!mat[x][y] || vis[x][y])
11 {
12 return;
13 }
14
15 vis[x][y] = 1; //标记此点访问过
16 dfs(x-1, y-1); dfs(x-1, y); dfs(x-1, y+1); //递归访问周围8个点
17 dfs(x, y-1); dfs(x, y+1);
18 dfs(x+1, y-1); dfs(x+1, y); dfs(x+1, y+1);
19 }
20
21 int main(void)
22 {
23 memset(mat, 0, sizeof(mat));
24 memset(vis, 0, sizeof(vis));
25
26 int i, j, n, cnt = 0;
27
28 scanf("%d", &n);
29 for (i=1; i<=n; i++)
30 {
31 for (j=1; j<=n; j++)
32 {
33 scanf("%d", &mat[i][j]);
34 }
35 }
36
37 for (i=1; i<=n; i++)
38 {
39 for (j=1; j<=n; j++)
40 {
41 if (mat[i][j] && !vis[i][j]) //找没访问过的黑格
42 {
43 cnt++;
44 dfs(i, j);
45 }
46 }
47 }
48
49 printf("%d\n", cnt);
50
51 return 0;
52 }