肿瘤面积
程序员文章站
2022-04-22 08:25:41
...
描述
在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用0表示。
其它肿瘤内和肿瘤外的点都用255表示。现在要求你编写一个程序,
计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。
输入
只有一个测试样例。第一行有一个整数n,表示正方形图像的边长。
其后n行每行有n个整数,取值为0或255。整数之间用一个空格隔开。已知n不大于1000。
输出
输出一行,该行包含一个整数,为要求的肿瘤内的像素点的个数。
样例输入
5 255 255 255 255 255 255 0 0 0 255 255 0 255 0 255 255 0 0 0 255 255 255 255 255 255
样例输出
1
思路:
本题采用总数减去边缘数减去边缘外围数,最后得到肿瘤面积,当然这只是其中的一种方法。
计算边缘数量:根据题意输出可以知道,题目所给的数据只包含一个肿瘤块,不会包含多个,所以可以知道所有出现的0都是肿瘤的边缘,所以在输入的时候就可以计算出肿瘤边缘数量。
计算肿瘤边缘外围的数量:按行计算,设一个整型变量flag=0,代表这一行是否出现0,即是否出现肿瘤边缘,flag=1代表出现,反之则没有出现。
如果flag=0,则这一行全部是255,即这一行都是边缘外围;
如果flag=1,则需要累加第一次出现边缘之前的数量,然后还要计算改行后面边缘外围的数量,相加即为本行的边缘外围的数量。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n;
int sum = 0;
int sum0 = 0;
cin>>n;
//动态创建二维数组
int **area = new int* [n];
for(int i=0; i<n; i++)
{
area[i] = new int[n];
}
//输入肿瘤布局
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin>>area[i][j];
if(area[i][j]==0)
{
sum0++; //计算边界数量
}
}
}
//按行计算非肿瘤块数
for(int i=0; i<n; i++)
{
int flag = 0; //标记是否出现肿瘤边界,出现置1
//计算边界前面非肿瘤像素个数
for(int j=0; j<n; j++)
{
if(area[i][j]==0)
{
flag = 1;
break;
}
else
{
sum++;
}
}
//该行出现肿瘤边界,计算边界后面非肿瘤像素
if(flag==1)
{
for(int j=n-1; j>=0; j--)
{
if(area[i][j]==0)
{
break;
}
else
{
sum++;
}
}
}
}
cout<<n*n-sum0-sum;
return 0;
}