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


    题目描述
    编程计算由‘*’号围成的下列图形的面积。面积的计算方法是统计*号所围成
    的闭合曲线中水平线和垂直线交点的数目。如图所示,在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;
    }
  • 相关阅读:
    linux服务器网络配置
    全面了解linux服务器
    centos selinux学习记录
    centos7使用samba共享文件
    centos7修改yum下载源为阿里源
    ubuntu14.04使用samba共享文件
    计算两个经纬度之间的距离(python算法)
    awk中的冒泡排序
    linux awk时间计算脚本
    linux shell中FS、OFS、RS、ORS图解
  • 原文地址:https://www.cnblogs.com/Zhoier-Zxy/p/8681375.html
Copyright © 2020-2023  润新知