描述
输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如图所示的图形有3个八连块。
输入
第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。
输出
在输入黑白图像中,八连块的个数
样例输入
6
100100
001010
000000
110000
111000
010100
样例输出
3
题目来源
http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3533
刚开始对我八连通理解错了,怎么都不能数出3个八连通,后来才理解八连通是说八个方向连通就当一个,只有一个单独的也算一个八连通,所以题目给的数据中有3个八连通.
其实这道题最好做的方法深搜,可是提交后却Runtime Error(STACK_OVERFLOW),让我很是郁闷,希望有朋友能帮我解决,谢谢.
不过我用广搜成功A掉了,现在贴出我的代码,分享给大家.
//dfs,测试没问题,不过就是无法通过,Runtime Error(STACK_OVERFLOW),让我很是郁闷,希望有朋友能帮助解决
#include <iostream>
using namespace std;
const int MAX_SIZE = 701;
char maze[MAX_SIZE][MAX_SIZE];
int N;
void dfs(int x , int y)
{
maze[x][y] = '0';
for(int i = -1 ; i <= 1 ; i++)
{
for(int j = -1 ; j <= 1 ; j++)
{
int gx = x + i;
int gy = y + j;
if(gx>=0 && gx<N && gy>=0 && gy<N && maze[gx][gy]=='1')
dfs(gx,gy);
}
}
}
int main()
{
cin>>N;
int ans = 0;
for(int i = 0 ; i < N ; i++)
cin>>maze[i];
for(int i = 0 ; i < N; i++)
{
for(int j = 0 ; j < N ; j++)
{
if(maze[i][j]=='1')
{
dfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
//bfs成功通过
#include <iostream>
#include <queue>
using namespace std;
const int MAX_SIZE = 701;
char maze[MAX_SIZE][MAX_SIZE];
int N;
void bfs(int x,int y)
{
maze[x][y] = '0';
queue<pair<int,int> > q;
pair<int,int> p;
q.push(make_pair(x,y));
while(!q.empty())
{
p = q.front();
q.pop();
for(int i = -1 ; i <= 1 ; i++)
{
for(int j = -1 ; j <= 1 ; j++)
{
int nx = p.first + i;
int ny = p.second + j;
if(maze[nx][ny]=='1')
{
maze[nx][ny]='0';
q.push(make_pair(nx,ny));
}
}
}
}
}
int main()
{
cin>>N;
int ans = 0;
for(int i = 0 ; i < N ; i++)
cin>>maze[i];
for(int i = 0 ; i < N; i++)
{
for(int j = 0 ; j < N ; j++)
{
if(maze[i][j]=='1')
{
bfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}