题目:1359:围成面积
题目描述
编程计算由“”号围成的下列图形的面积。面积计算方法是统计号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10×10的二维数组中,有“*”围住了15个点,因此面积为15。 
输入
10×10的图形。
输出
输出面积。
时空限制
1s / 64MB
样例输入
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
样例输出
15
代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=10+10;
int n=10,g[N][N],ans,k,sx,sy;
int dx[10]={–1,1,0,0},dy[10]={0,0,–1,1};
int bfs(int x,int y){
queue<PII> q;
q.push({x,y});
g[x][y]=1;
int sum=1;
while(!q.empty()){
PII t=q.front();
q.pop();
for(int i=0;i<4;i++){
int xx=t.first+dx[i],yy=t.second+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&!g[xx][yy]){
q.push({xx,yy});
g[xx][yy]=1;
sum++;
}
}
}
return sum;
}
int main(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>g[i][j];
if(g[i][j]) ans++;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if((i==1||i==n||j==1||j==n)&&!g[i][j])
ans+=bfs(i,j);
cout<<100–ans;
return 0;
}
结果




