【问题描述】
在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片 中用 0 表示。其它肿瘤内和肿瘤外的点都用 255 表示。现在要求你编写一个程序,计算肿瘤内部的像素点的个数(不包括肿瘤边缘上的点)。已知肿瘤的边缘平行于图像的边缘。
【输入形式】
输入的第一行是一个正整数n(3<=n<=600),表示正方形的边长,接下来的n行,每行有n个由空格隔开的n个整数,表示每个像素点。
【输出形式】
输出包括一行,这一行只包含一个整数,表示肿瘤内部的像素点的个数。
【样例输入】
3
0 0 0
0 255 0
0 0 0
【样例输出】
1
算法思路:由题目可知,肿瘤的面积是个矩形,主要运用二维数组进行求解。只要找到左上角和右下角的肿瘤,就可以求出其面积。对于左上角
的肿瘤,需要判断该位置
和右侧
以及下侧
均为肿瘤;对于右下角
的肿瘤,需要判断该位置
和左侧
以及上侧
均为肿瘤。左上角通过正向双重循环遍历,右下角则通过逆向双重循环遍历。
#include <iostream>
using namespace std;
int main()
{int n,x1,y1,x2,y2;cin>>n;int a[n][n];for(int i=0; i<n; i++){for(int j=0; j<n; j++){cin>>a[i][j];}}int p,q,sign=0;for(p=0; p<n; p++){for(q=0; q<n; q++){if(a[p][q]==0&&a[p][q+1]==0&&a[p+1][q]==0)//该位置、下、右{sign=1;y1=q;break;}}if(sign==1){x1=p;break;}}sign=0;int u,v;for(u=n-1; u>1; u--){for(v=n-1; v>1; v--){if(a[u][v]==0&&a[u][v-1]==0&a[u-1][v]==0)//该位置、上、左{sign=1;y2=v;break;}}if(sign==1){x2=u;break;}}int sum;sum=(x2-x1-1)*(y2-y1-1);cout<<sum;return 0;
}