题目描述
编程计算由"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;
}