您的位置:首页 > 其它

黑白图像(入门DFS)

2012-02-21 15:01 211 查看
输入一个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

#include <stdio.h>
#include <string.h>

#define MAX 1000+10

char mat[MAX][MAX], vis[MAX][MAX];

void dfs(int x, int y)         //mat[][]存图像,1代表黑; vis[][]标记是否访问过这个格子
{
if (!mat[x][y] || vis[x][y])
{
return;
}

vis[x][y] = 1;             //标记此点访问过
dfs(x-1, y-1); dfs(x-1, y); dfs(x-1, y+1);   //递归访问周围8个点
dfs(x, y-1);                dfs(x, y+1);
dfs(x+1, y-1); dfs(x+1, y); dfs(x+1, y+1);
}

int main(void)
{
memset(mat, 0, sizeof(mat));
memset(vis, 0, sizeof(vis));

int i, j, n, cnt = 0;

scanf("%d", &n);
for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
scanf("%d", &mat[i][j]);
}
}

for (i=1; i<=n; i++)
{
for (j=1; j<=n; j++)
{
if (mat[i][j] && !vis[i][j])   //找没访问过的黑格
{
cnt++;
dfs(i, j);
}
}
}

printf("%d\n", cnt);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: