題目描述
編程計算由"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; }
