判断有几块连通区域

随笔写的,感觉用得到

首先是输入一个数组

由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;
}

猜你喜欢

转载自blog.csdn.net/qq_37650593/article/details/79872256