18:肿瘤面积
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
在一个正方形的灰度图片上,肿瘤是一块矩形的区域,肿瘤的边缘所在的像素点在图片中用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
提示
如果使用静态数组来表示图片数据,需要将该数组定义成全局变量。
【问题分析】
1、此题已经告诉我们肿瘤是一块矩形的区域
2、因此我们只要找到矩形最左上角的点的位置(i1,j1)和最右下角的点的位置(i2,j2),矩形里面肿瘤点的面积就求出来s=(i2-i1-1)*(j2-j1-1)
【方法1】
#include<bits/stdc++.h>
int a[1005][1005];
using namespace std;
int main()
{
int n,i1,i2,j1,j2,s,m2=0,m1=0;
cin >> n;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin >> a[i][j];
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (a[i][j]==0) {m1++;j1=j;break;}
}
if (m1==1) {i1=i;break;}
}//左上角的点
for (int i=n;i>=1;i--)
{
for (int j=n;j>=1;j--)
{
if (a[i][j]==0) {m2++;j2=j;break;}
}
if (m2==1) {i2=i;break;}
}//右下角的点
cout << i1 << " " << j1 << endl;
cout << i2 << " " << j2 << endl;
s=(i2-i1-1)*(j2-j1-1);
cout << s << endl;
return 0;
}
**【方法2】**如果这样写找的是左下角和右上角的点,建议方法1
#include<bits/stdc++.h>
int a[1005][1005];
using namespace std;
int main()
{
int n,i1,i2,j1,j2,s;
cin >> n;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin >> a[i][j];
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
if (a[i][j]==0) {
i1=i;j1=j;break;
}
}
}//左下角的点
for (int i=n;i>=1;i--)
for (int j=n;j>=1;j--)
{
if (a[i][j]==0) {
i2=i;j2=j;break;
}
}//右上角的点
cout << i1 << " " << j1 << endl;
cout << i2 << " " << j2 << endl;
s=(i1-i2-1)*(j2-j1-1);
cout << s << endl;
return 0;
}