黑白图像(入门DFS)

输入一个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 }



转载于:https://www.cnblogs.com/RootJie/archive/2012/02/21/2361327.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值