1. 程式人生 > >判斷有幾塊連通區域

判斷有幾塊連通區域

隨筆寫的,感覺用得到

首先是輸入一個數組

由1和0組成

最後求四連通區域有幾個

如:

1 1 1 0

0 0 0 1

0 0 0 0

1 1 0 0

有三個連通區域

思路如下:採用遞迴思想

一開始我是這麼想的,按行遍歷,若遇到一個數字為1,那麼先看下面的是不是1,然後再看上面的,左面的,右面的,遞迴操作,但是這會出現問題,我們可能會產生重複判斷,這樣我加入了一個檢查陣列check,問題解決,程式碼如下:

#include<iostream>
#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;
}