百练2713:肿瘤面积

总时间限制: 
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);

}
原文地址:https://www.cnblogs.com/starryxsky/p/7101829.html