DS图—图非0面积

题目描述

编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示,在10*10的二维数组中,"1"围住了15个点,因此面积为15。

输入

测试次数t

每组测试数据格式为:

数组大小m,n

一个由0和1组成的m*n的二维数组

输出

对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。

样例输入

2 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 5 8 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0

样例输出

15 5

提示

#include<iostream>
#include<queue>
using namespace std;
int n,m;
int nx[4] = {0,0,1,-1};
int ny[4] = {1,-1,0,0};
void bfs(int M[40][40],queue<int>x,queue<int>y,int a,int b)
{
    x.push(a);
    y.push(b);
    while(!x.empty())
    {
        for(int i=0;i<4;i++)
        {
            if(x.front()+nx[i]<=n&&x.front()+nx[i]>=0&&y.front()+ny[i]<=m&&y.front()+ny[i]>=0&&M[x.front()+nx[i]][y.front()+ny[i]]==0)
            {
                x.push(x.front()+nx[i]);
                y.push(y.front()+ny[i]);
                M[x.front()+nx[i]][y.front()+ny[i]]=1;
            }
        }
        x.pop();
        y.pop();
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int M[40][40]={0};
        queue<int>x;
        queue<int>y;
        int num=0;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>M[i][j];
        bfs(M,x,y,0,0);
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if(M[i][j]==0)
                {
                    num++;
                }
            }
        }
        cout<<num<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SZU-DS-wys/p/12180948.html