围成面积

Posted Ed_Sheeran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了围成面积相关的知识,希望对你有一定的参考价值。

围成面积

链接: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;

}

 



以上是关于围成面积的主要内容,如果未能解决你的问题,请参考以下文章

水库容量该如何计算?

闭合区域面积统计(题解)

22..广搜:被围住的面积

矩形最大面积

求助:如何用matlab测量中国地图面积

SSOJ 2316 面积DFS/Flood Fill