您的位置:首页 > 其它

黑白图像问题[DFS]

2014-04-24 14:53 225 查看
        输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中连块的个数。如果两个黑格子有公共边,就是属于一个连快。如图:

                                           


输入时,每个数据之间有一个空格。

样例输入:

1 0 0 0 0 1 0 0

0 0 0 0 1 1 1 0

0 1 1 0 0 0 0 0

0 1 1 1 0 0 0 0

0 0 0 0 0 0 1 0

1 1 0 0 0 1 1 1

1 1 1 0 0 0 1 1

0 1 0 0 0 0 1 0

样例输出:

5

 

用递归求解:从每个黑格子出发,递归访问它所有相邻的黑格。

这里,黑格的mat[x][y]为1,白格为0。问:这个程序是在哪里判断出界的?答案是:在输入之前,在迷宫的外面加上一圈虚拟的白格子,代码如下:

#include <iostream>
#include <cstring>
using namespace std;
#define MAXN 50
int mat[MAXN][MAXN]; /**黑色为1,   白色为0 */
int vis[MAXN][MAXN]; /**访问为1,未访问为0 */
int s[MAXN][MAXN];
void dfs(int x,int y)
{   if ( mat[x][y]==0 || vis[x][y]) return; /**访问过这个格子,或者这个格子是白色*/
vis[x][y]=1;
dfs(x,y-1);
dfs(x-1,y);             dfs(x+1,y);
dfs(x,y+1);
/**递归访问周围的4个格子**/
}
int main()
{
int n;
cin>>n;
memset(mat,0,sizeof(mat));
/**所有格子初始化为白色,包括周围一圈的虚拟格子*/
memset(vis,0,sizeof(vis));
for (int i = 0 ; i < n ; i++)
for (int j = 0 ; j < n ; j++)
{
cin>>s[i][j];
mat[i+1][j+1]=s[i][j]; /**把图像往中间移动一点,空出白格子*/
}
int count = 0;
for (int i = 1 ; i <= n ; i++ )
for (int j = 1; j <= n; j++)
if (mat[i][j]==1 && vis[i][j]==0) {count++; dfs(i,j);}
cout<<count<<endl;
return 0;
}


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