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

题目描述
编程计算由‘*’号围成的下列图形的面积。面积的计算方法是统计*号所围成
的闭合曲线中水平线和垂直线交点的数目。如图所示,在10*10 的二维数组中,
有*围住了15 个点,因此面积为15。
0 0 0 0 0 0 0 0 0 0
0 0 0 0 * * * 0 0 0
0 0 0 0 * 0 0 * 0 0
0 0 0 0 0 * 0 0 * 0
0 0 * 0 0 0 * 0 * 0
0 * 0 * 0 * 0 0 * 0
0 * 0 0 * * 0 * * 0
0 0 * 0 0 0 0 * 0 0
0 0 0 * * * * * 0 0
0 0 0 0 0 0 0 0 0 0
输入
一个10*10 的二维数组, 里面的数为0 和1,1 代表着*号。
输出
一个整数, 被围住的点。
样例输入
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

 

  这道题可以用宽搜来解决。

  先开两个队列,用来存走过的每一个点的坐标。之后直接计算闭合区间的面积是很费劲的,但是如果把这个面积之外到整个边界的数都转换成“1”的话,就可以直接算“0”的个数,就是图形的面积了。

  所以:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int map[15][15];
int nx[5] = {0,0,1,-1};
int ny[5] = {1,-1,0,0};
queue <int> x;
queue <int> y;
void bfs(int a,int b)
{
    x.push(a);
    y.push(b);
    while(x.empty() == 0)
    {
        for(int i = 0; i < 4; i++)
        {
            if(x.front() + nx[i] <=11&&x.front() + nx[i] >= 0&&y.front() + ny[i] <= 11&&y.front() + ny[i] >= 0&&map[x.front() + nx[i]][y.front() + ny[i]] == 0)
            {
                x.push(x.front() + nx[i]);
                y.push(y.front() + ny[i]);
                map[x.front() + nx[i]][y.front() + ny[i]] = 1;
            }
        }
        x.pop();
        y.pop();
    }
}
int main()
{
    //freopen("area.in","r",stdin);
    //freopen("area.out","w",stdout);
    int num;
    for(int i = 1; i <= 10; i++)
    {
        for(int j = 1; j <= 10; j++)
            scanf("%d",&map[i][j]);
    }
    bfs(0,0);
    for(int i = 0; i <= 11; i++)
    {
        for(int j = 0; j <= 11; j++)
        {
            if(map[i][j] == 0)
                num++;
        }
    }
    cout<<num<<endl;
    return 0;
}

 

posted @ 2018-03-31 11:12  Zhoier  阅读(1756)  评论(0编辑  收藏  举报