欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

肿瘤面积

程序员文章站 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;
}

 

相关标签: 肿瘤面积