问题 E: DS图—图非0面积时间限制

题目描述

编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示,在10*10的二维数组中,"1"围住了15个点,因此面积为15。

输入

测试次数t

每组测试数据格式为:

数组大小m,n

一个由0和1组成的m*n的二维数组

输出

对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。

样例输入

2 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 5 8 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0

样例输出

15 5

#include<iostream>
#include<queue>
using namespace std;
int n, m;
int nx[4] = { 0,0,1,-1 };//设置上下移动数组 
int ny[4] = { 1,-1,0,0 };//设置左右移动数组 
void BFS(int** M, queue<int>x, queue<int>y, int a, int b)
{
    x.push(a);
    y.push(b);
    while (!x.empty())//队列不为空 
    {
        for (int i = 0; i < 4; i++)
        {
            //若上或下或左或右移动后的点未是越过二维数组上界且该点为0 

            if (x.front() + nx[i] <= m && x.front() + nx[i] >= 0 && y.front() + ny[i] <= n && y.front() + ny[i] >= 0 && M[x.front() + nx[i]][y.front() + ny[i]] == 0)
            {
                x.push(x.front() + nx[i]);//将其上或下或其本身入队 
                y.push(y.front() + ny[i]);//将其左或右或其本身入队 
                M[x.front() + nx[i]][y.front() + ny[i]] = 1;//将移动后该点设置为1 
            }
        }
        //队头出队列 
        x.pop();
        y.pop();
    }
}
void input(int** map, int m, int n) {
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            map[i][j]=0;
        }
    }
    for (int i = 1; i <= m; i++)
        for (int j = 1; j <= n; j++)
            cin >> map[i][j];
}
void output(int** map, int m, int n) {
    int num = 0;
    for (int i = 0; i <= m; i++)
    {
        for (int j = 0; j <= n; j++)
        {
            if (map[i][j] == 0)
            {
                num++;
            }
        }
    }
    cout << num << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int** M;
        queue<int>x;
        queue<int>y;
        cin >> m >> n;
        M = new int* [m+1];
        for (int i = 0; i <= m; i++)//建立二维数组上界加1使数组整体向右下移动
            M[i] = new int[n+1];
        input(M, m, n);//输入数组
        BFS(M, x, y, 0, 0);//BFS算法
        output(M, m, n);//输出结果
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值