判斷有幾塊連通區域
阿新 • • 發佈:2018-11-10
隨筆寫的,感覺用得到
首先是輸入一個數組
由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;
}