- 总时间限制:
- 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
- 提示
- 如果使用静态数组来表示图片数据,需要将该数组定义成全局变量。
- 来源
- 2005~2006医学部计算概论期末考试
- 分析
- 从左至右从上到下地扫描该图片,这样可以保证找到肿瘤边界时(即值为0的坐标时),该坐标是肿瘤的左上角的点。
- 从这个点出发,向右和向下扫描,统计这个肿瘤的长和宽,并将肿瘤的边界打上标记,下次再扫描到的时候直接跳过。
-
#include <cstdio> #define N 1002 using namespace std; int g[N][N]; bool mark[N][N]; struct node{ int x,y; }; /* 5 0 0 0 0 0 0 255 255 255 0 0 255 255 255 0 0 0 0 0 0 255 255 255 255 255 (*/ int sum; int main(){ int n; scanf("%d",&n); node s; bool first = true; for(int i = 0;i < n;i++) for(int j = 0;j < n;j++){ scanf("%d",&g[i][j]); } sum = 0; for(int i = 0;i < n;i++) for(int j = 0;j < n;j++){ if(mark[i][j] == 0 && g[i][j] == 0){ int right,down; right = down = n - 1; for(int p = j;p < n;p++){ if(g[i][p] == 0) mark[i][p] = 1; else{ right = p-1; break; } } for(int q = i;q < n;q++){ if(g[q][j] == 0){ mark[q][j] = 1; mark[q][right] = 1; }else{ down = q-1; break; } } for(int p = j;p < right;p++){ mark[down][p] = 1; } sum += (right-j-1) * (down-i-1); } } printf("%d",sum); }
时间: 2024-09-29 00:14:10