仅为记录自己学习 切勿抄袭(一起0分?)
题目描述
编程计算由"1"围成的下列图形的面积。面积计算方法是统计"1"所围成的闭合曲线中"0"点的数目。如图所示,在10*10的二维数组中,"1"围住了15个点,因此面积为15。
提示:queue
输入
测试次数t
每组测试数据格式为:
数组大小m,n
一个由0和1组成的m*n的二维数组
输出
对每个二维数组,输出符号"1"围住的"0"的个数,即围成的面积。假设一定有1组成的闭合曲线,但不唯一。
#include<iostream>
using namespace std;
class Map {
int** matrix;
int row;
int list;
void turnto1(int x,int y)
{
if (x < 0 || y < 0 || x >= row || y >= list || matrix[x][y] == 1)//越界或者遇到1了
return;
matrix[x][y] = 1;//置一
turnto1(x - 1, y);//向上遍历
turnto1(x+1, y);//向下遍历
turnto1(x, y - 1);//向左遍历
turnto1(x, y + 1);//向右遍历
}
public:
void init()
{
cin >> row >> list;
matrix = new int*[row];
for (int i = 0; i < row; i++) {
matrix[i] = new int[list];
for (int j = 0; j < list; j++)
cin >> matrix[i][j];
}
}
void cnt()
{
for (int i = 0; i < row; i++)
{
turnto1(i, 0);//为了防止出现被1截断的情况 如 001000100,需要从后往前再遍历一次
turnto1(i, list- 1);
}
for (int i = 0; i < list; i++)
{
turnto1(0, i);
turnto1(i, list - 1);
}
int count = 0;
for (int i = 0; i < row; i++)
for (int j = 0; j < list; j++)
if (matrix[i][j] == 0)
count++;
cout << count << endl;
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
Map map;
map.init();
map.cnt();
}
}