您的位置:首页 > 其它

黑白图像

2015-07-14 14:44 344 查看
输入一个n*n的黑白图像(1表示黑色,0表示白色 ),任务是统计其中八连块的个数,并输出其中最大的块数,如果两个黑格子有公共边或者公共顶点,就说他们属于同一个八连块。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const int Max = 100;
int a[Max],maxnumber = 0,fn = 0;
int mat[Max][Max];
int vis[Max][Max];
void dfs(int x,int y)
{
if(vis[x][y] || !mat[x][y]) return ;
vis[x][y] = 1;
fn++;
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
dfs(x-1,y-1);
dfs(x-1,y+1);
dfs(x+1,y+1);
dfs(x+1,y-1);
}
int main()
{
int n;
char s[Max];
while(cin>>n)
{
int cnt =0;
maxnumber = 0;
memset(mat,0,sizeof(mat)); //初始化为白的
memset(vis,0,sizeof(vis)); //初始化为未访问
for(int i = 0; i < n; i++ )
{
cin>>s;
for(int j = 0; j < n; j++)
mat[i+1][j+1] = s[j]-'0';  //将字符串改为01数字,并且把图像网中间移动一个方格,空出一圈白格子。
}

for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++){
if(!vis[i][j] && mat[i][j]){
fn = 0;
dfs(i,j);
cnt++;
if(fn>maxnumber) maxnumber = fn;
//cout<<maxnumber<<endl;
}
}
}
cout<<cnt<<endl;
cout<<maxnumber<<endl;
}
}
刚开始把fn设置为dfs中的参数,却发现八连块的最大值总是错的,原来是程序执行dfs时当return时fn的值也将退回造成的。想想应该把fn定义在dfs外面,执行了几次递归调用就++几次。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: