您的位置:首页 > 其它

算法竞赛入门经典 第六章 黑白图像

2014-06-07 17:28 211 查看
输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说他们属于同一个八连块。

样例输入:

6

100100

001010

000000

110000

111000

010100

样例输出:

3

遍历每一块黑色格子,以这块黑色格子为中心向四周搜索,如果被访问过则停止搜索(即vis[i][j]=1)。

#include <stdio.h>
#include <memory.h>
#include <string.h>
int mat[100][100],vis[100][100];
char s[100];
void dfs(int i,int j)
{
if(vis[i][j]||mat[i][j]==0) return ;
vis[i][j]=1;
dfs(i-1,j-1);dfs(i-1,j);dfs(i-1,j+1);
dfs(i,j-1);              dfs(i,j+1);
dfs(i+1,j-1); dfs(i+1,j);dfs(i+1,j+1);
}

int main (void)
{
//  freopen("黑白图像.txt","r",stdin);
int i,j,n,count;
while(scanf("%d",&n)!=EOF)
{
memset(mat,0,sizeof(mat));
memset(vis,0,sizeof(vis));
count=0;
for(i=1;i<=n;i++)
{
scanf("%s",s);
for(j=1;j<=n;j++)
{
mat[i][j]=s[j-1]-'0';
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(mat[i][j]&&vis[i][j]==0)
{
count++;
dfs(i,j);
}
}
}
printf("%d\n",count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: