题目描述
编程计算由"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; }