围成面积
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1359时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。
【输入】
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
【输出样例】
15
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; int a[105]; bool b[105]; int zl[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int mp[15][15]; struct node{ int x,y; node():x(),y(){} node(const int x,const int y):x(x),y(y){} }; queue <node>Q; int t=1,ans; void bfs(int x,int y) { mp[x][y]=++t; a[t]++; Q.push(node(x,y)); while(!Q.empty()) { node u=Q.front(); Q.pop(); for(int i=0;i<4;i++) { int xx=u.x+zl[i][0],yy=u.y+zl[i][1]; if(xx>0&&xx<=10&&yy>0&&yy<=10&&!mp[xx][yy]) { mp[xx][yy]=t; a[t]++; Q.push(node(xx,yy)); } } } } int main() { for(int i=1;i<=10;i++) for(int j=1;j<=10;j++) cin>>mp[i][j]; for(int i=1;i<=10;i++) for(int j=1;j<=10;j++) if(!mp[i][j]) bfs(i,j); for(int i=1;i<=10;i++)b[mp[i][1]]=1; for(int i=1;i<=10;i++)b[mp[i][10]]=1; for(int i=1;i<=10;i++)b[mp[10][i]]=1; for(int i=1;i<=10;i++)b[mp[1][i]]=1; for(int i=2;i<=9;i++) for(int j=2;j<=9;j++) if(!b[mp[i][j]]&&mp[i][j]!=1) { b[mp[i][j]]=1; ans+=a[mp[i][j]]; } cout<<ans<<endl; }