随笔写的,感觉用得到
首先是输入一个数组
由1和0组成
最后求四连通区域有几个
如:
1 1 1 0
0 0 0 1
0 0 0 0
1 1 0 0
有三个连通区域
思路如下:采用递归思想
一开始我是这么想的,按行遍历,若遇到一个数字为1,那么先看下面的是不是1,然后再看上面的,左面的,右面的,递归操作,但是这会出现问题,我们可能会产生重复判断,这样我加入了一个检查数组check,问题解决,代码如下:
#include<vector>
using namespace std;
#define N 10
bool judge(int area[][N],int check[][N],int i,int j)
{
if(j<0||j>N-1||i<0||i>N-1)
{
return false;
}
if(area[i][j]==1&&check[i][j]==1)
{
check[i][j]=0;
return true;
}
return false;
}
void f(int area[][N],int check[][N],int i,int j)
{
if(judge(area,check,i,j))
{
f(area,check,i+1,j);//down
f(area,check,i-1,j);//up
f(area,check,i,j-1);//left
f(area,check,i,j+1);//right
}
else{
return;
}
}
int main()
{
int area[N][N];
int check[N][N]={0};
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
cin>>area[i][j];
if(area[i][j]==1)
{
check[i][j]=1;
}
}
}
int sum =0;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(check[i][j]==1)
{
f(area,check,i,j);
sum++;
}
}
}
cout<<sum<<endl;
return 0;
}